2008-10-15 49 views
8

我正在处理的一个项目需要在关闭之前序列化数据结构,并在再次启动时从该序列化数据恢复其状态。跨不同框架版本的.NET序列化的稳定性

去年,我们正在建造的.NET 1.1,跑进一个棘手的问题,即

  • 我们的代码运行在.NET 2.0
  • 与一些软件,莫名其妙定置1.1默认升级客户
  • 我们的代码运行在.NET 1.1和无法反序列化其存储的状态

这个具体问题被禁止特定的软件升级“解决”,而不应该是一个概率现在我们要面向.NET 2.0框架(所以我们不可能在1.1上运行)。

这个序列化可能再次改变2.0和更新的框架之间的不兼容性的可能性是什么?如果我们使用<supportedVersion>将我们的代码修复为2.0.50727,那么2.0.50727.1434和2.0.50727.nnnn(某些未来发行版)之间的更改机会有多大?序列化的数据结构是标准类库中的数组,地图,字符串等。

此外,是否保证2.0.50727框架即使在进一步的.NET升级后也会一直安装?指向Microsoft文档欢迎。

回答

6

机会很低(但不是零!)框架版本之间会有变化。意图是你应该能够使用二进制序列化和远程处理在客户端和运行不同框架版本的服务器之间进行通信。 .NET 1.x和2.0可用的2.0 is a bug之间的不兼容性。

但是,二进制序列化还有其他问题,特别是对序列化结构版本化的支持不足。从你所描述的用例中,Xml序列化是一个明显的选择:如果你不介意对.NET 3.x的依赖,DataContractSerializer比XmlSerializer更灵活。

您不能保证.NET Framework 2.0将始终安装在未来版本的Windows上。但我相信微软将努力确保大多数.NET 2.0应用程序在.NET 4.x和更高版本上运行不变。我没有任何参考资料:任何这种承诺在任何情况下都只适用于Windows的下一版本(Windows 7)。

+1

我同意大部分内容,但是我没有看到Windows 7的一点......我不知道关于.NET 4.x或Windows的大量数据7,但我希望.NET 4.x能够兼容Vista和/或XP。当然,我可能是无知的; -p – 2008-10-15 07:52:56

3

你在使用什么串行器?在许多方面,像XmlSerializer或DataContractSerializer这样的序列化程序可以从许多细节中缓冲您的工作,并提供更简单的扩展选项。 在某些情况下,新的CLR版本无疑是必要的 - 所以我不认为任何人都可以对2.0.50727做任何保证;尽管如此,你应该是短期安全的。而且我希望更少的重大更改...

[另一回复更新以下注意事项】

如果你想为空间/性能原因二进制格式,那么另一种选择是使用不同的二进制序列。例如,protobuf-net适用于所有.NET变体*,但二进制格式(由Google制定)是跨平台兼容的(Java,C++等),使其非常便于携带,速度快,体积小。

* =我还没有尝试过微型框架,但CF,Silverlight,Mono,.NET 2.0等都支持。

4

经验法则通常是:XML序列化应该能够在新的框架版本中存活,因此可以长期存储,但二进制序列化不能(因此应该只是暂时的)。

+1

捡起来; BinaryFormatter等/可能/有问题...有二进制格式是以数据为中心的,而不是以类型为中心的,并且为此目的可以被认为类似于“密集的xml”。 “protobuf-net”就是其中之一; -p – 2008-10-15 06:09:49

2

如果兼容性问题,ISerializable接口可能是您正在寻找的治疗方法。这个界面可以让你更好地控制项目的序列化。欲了解更多信息,请尝试这个article on msdn

2

我有两件事情要添加到其他的答案...

首先,利用定制SerializationBinder的可以让你圆大量的进口遗留串行数据的困难。其次,我认为必须为所有持久数据编写大量的单元测试。我总是做两个测试:

  1. 往返测试 - 你可以序列化和反序列化你的对象,并得到完全一样的东西吗?
  2. 传统导入测试 - 确保您的应用程序的每个发布版本都有导出序列化数据的版本。导入数据并检查一切是否按预期恢复。
0

为了获得更高的灵活性和版本控制,您不必使用XML。

我已经使用了Simon Hewitt的开源库,请参阅Optimizing Serialization in .NET - part 2而不是默认的.NET序列化。它提供了一些自动化功能,但基本上可以控制序列化和反序列化的信息流。对于版本控制,可以首先对(文件)版本进行序列化,并在解串行时解释信息流的方式取决于版本。

这样做很简单,虽然由于显式的 序列化/反序列化而有点繁琐。

作为奖励,它的速度提高了20-40倍,占用了大量数据集的空间(但在您的情况下可能不重要)。