使用新成员反序列化对象

时间:2011-01-23 20:26:37

标签: c# .net vb.net .net-2.0

根据mspress书(MCTS for Exam 70-536 .NET 2.0):

  

如果您尝试反序列化由早期版本的应用程序序列化的对象,则可能存在版本兼容性问题。具体来说,如果将成员添加到自定义类并尝试反序列化缺少该成员的对象,则运行时将引发异常。换句话说,如果将一个成员添加到应用程序的3.1版中的类,它将无法反序列化由应用程序3.0版创建的对象。

现在......像我一样好奇,我去创建了一个项目,序列化了一个类,添加了一个新成员并尝试将该类反序列化为新对象。令我惊讶的是它工作正常,新创建的成员默认设置为null(即使它有另一个默认值)。

我首先尝试添加一个String作为新成员,看到它工作,然后我将其更改为另一个自定义类,它仍然有用。

mspress是错的吗?或者这种行为是否可以自定义?

请注意,我使用XML序列化。我正在使用BinaryFormatter序列化。

3 个答案:

答案 0 :(得分:2)

Mspress反其道而行之。序列化类,删除成员,反序列化,这将无效。基本上它会从流中读取成员,并在找不到时抛出异常。另一种方法是不关心流中是否存在字段。

答案 1 :(得分:2)

BinaryFormatter(坦率地说)非常挑剔,但添加了version tolerant serialization - 想法只是将[OptionalField]添加到您希望的那些字段中空。

但是,如果你说它被反序列化为null,甚至可能证明这太痛苦了,并且他们只是将“可选”作为默认行为。

请注意BinaryFormatter的许多缺点(加上它不是与平台无关的事实)是我不使用它的原因; p

答案 2 :(得分:1)

我继续使用序列化运行测试并且同意@Mehrdad关于某些序列化过程支持反序列化现在有新成员的对象(尽管他说它倒退了)。

BinaryFormatter序列化,就像Marc Gravell解释的那样,似乎确实支持版本容忍反序列化,我也测试了它以使用XMLSerialization。请注意,XMLSerialization仅序列化和反序列化公共成员。

另一方面,

SoapFormatter不支持这种类型的行为,并且在使用新添加的成员反序列化对象时会抛出异常。

我没有使用自定义序列化进行测试,但由于它的性质,目的和设计,它应该是自己的版本。

我认为只是为了安全起见,你应该总是使用[OptionalField]属性。