2009-04-09 66 views
1

.NET 2.0中引入的VTS(版本容错序列, http://msdn.microsoft.com/en-us/library/ms229752(VS.80).aspx如何处理在.net序列变化2.0

一个简单的测试项目显示,在2.0的默认行为是不是抛出一个异常系列化如果一个字段被添加到一个类中,然后试图从没有新字段的类实例的二进制序列化中反序列化该类的一个实例。

1.1中的默认行为是在二进制序列化位中缺少类中存在的字段时抛出序列化异常。除了破坏向后兼容性(依赖于抛出的异常的代码不再有效),还有一个更大的问题:在2.0中没有明显的方式来模拟1.1行为。

如何在2.0中模拟'丢失/额外字段'1.1行为的异常?

非常感谢, 米龙

回答

2

只有应用了OptionalFieldAttribute特性的字段应该在反序列化过程中忽略缺少的信息。简单地删除该属性应该会产生一个异常,并导致与.NET Framework 1.1中相同的行为。

更新:

罪魁祸首必须BinaryFormatter类,其是由FormatterAssemblyStyle.Full默认在1.1的AssemblyFormat属性,但它是FormatterAssemblyStyle.Simple默认在2.0。

实际上,将它设置为1.1中的FormatterAssemblyStyle.Simple将产生与2.0中相同的行为:不会抛出异常。最后在.NET 2.0中,您可以使OptionalFieldAttribute更细化。

因此,将此属性设置为FormatterAssemblyStyle.Full,并查看它的功能。请参阅here

+0

这就是我的想法。但是一个包含两个字段(没有OptionalFieldAttribute,1.1和2.0上的相同代码)的类的简单测试会在1.1上引发序列化异常,并在2.0中静默使用默认值。 – 2009-04-09 13:22:15

2

在一般情况下,人们希望能够至少反序列化的旧数据,无论更改类的设计。不幸的是,BinaryFormatter(基于字段)在这里非常脆弱 - 甚至切换到自动实现的属性can break things

就个人而言,我会围绕数据,合同或类似结构是实施的具体设计,并扩展。对于二进制,protobuf-net在这方面有很多用途。

如果你真的想模仿1.1的行为 - 手工执行ISerializable并自己抛出异常(或不)。

+0

谢谢,protobuf网似乎是一个有趣的图书馆。我会考虑将来使用它。 – 2009-04-10 07:35:22