如何处理.NET 2.0中的序列化更改

时间:2009-04-09 11:01:45

标签: .net serialization

.NET 2.0引入了VTS(版本容忍序列化, http://msdn.microsoft.com/en-us/library/ms229752(VS.80).aspx

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

1.1中的默认行为是,如果二进制序列化位中缺少类中存在的字段,则抛出序列化异常。

除了破坏向后兼容性(依赖于抛出的异常的代码不再起作用),还有一个更大的问题:没有明显的方法来模拟2.0中的1.1行为。

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

非常感谢, 米龙

2 个答案:

答案 0 :(得分:2)

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

就个人而言,我将围绕数据合同或类似结构进行设计,这些结构特定于实现, 可扩展。对于二进制文件,protobuf-net在此区域有很多用途。

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

答案 1 :(得分:2)

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

更新

罪魁祸首必须是BinaryFormatter类的AssemblyFormat属性,默认情况下为1.1格式的FormatterAssemblyStyle.Full,但默认情况下为2.0格式的FormatterAssemblyStyle.Simple。

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

因此,请将此属性设置为FormatterAssemblyStyle.Full,并查看它的作用。

另见here