根据mspress书(MCTS for Exam 70-536 .NET 2.0):
如果您尝试反序列化由早期版本的应用程序序列化的对象,则可能存在版本兼容性问题。具体来说,如果将成员添加到自定义类并尝试反序列化缺少该成员的对象,则运行时将引发异常。换句话说,如果将一个成员添加到应用程序的3.1版中的类,它将无法反序列化由应用程序3.0版创建的对象。
现在......像我一样好奇,我去创建了一个项目,序列化了一个类,添加了一个新成员并尝试将该类反序列化为新对象。令我惊讶的是它工作正常,新创建的成员默认设置为null(即使它有另一个默认值)。
我首先尝试添加一个String作为新成员,看到它工作,然后我将其更改为另一个自定义类,它仍然有用。
mspress是错的吗?或者这种行为是否可以自定义?
请注意,我不使用XML序列化。我正在使用BinaryFormatter序列化。
答案 0 :(得分:2)
答案 1 :(得分:2)
BinaryFormatter
(坦率地说)非常挑剔,但添加了version tolerant serialization - 想法只是将[OptionalField]
添加到您希望的那些字段中空。
但是,如果你说它被反序列化为null,甚至可能证明这太痛苦了,并且他们只是将“可选”作为默认行为。
请注意BinaryFormatter
的许多缺点(加上它不是与平台无关的事实)是我不使用它的原因; p
答案 2 :(得分:1)
我继续使用序列化运行测试并且同意@Mehrdad关于某些序列化过程支持反序列化现在有新成员的对象(尽管他说它倒退了)。
BinaryFormatter序列化,就像Marc Gravell解释的那样,似乎确实支持版本容忍反序列化,我也测试了它以使用XMLSerialization。请注意,XMLSerialization仅序列化和反序列化公共成员。
另一方面,SoapFormatter不支持这种类型的行为,并且在使用新添加的成员反序列化对象时会抛出异常。
我没有使用自定义序列化进行测试,但由于它的性质,目的和设计,它应该是自己的版本。
我认为只是为了安全起见,你应该总是使用[OptionalField]属性。