2011-01-23 73 views
3

根据MSPRESS书(MCTS的考试70-536 .NET 2.0):反序列化对象的新成员

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

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

我首先尝试添加一个字符串作为新成员,看到工作,然后我改变它到另一个自定义类,它仍然工作。

mspress错了吗?或者这种行为是否可定制?

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

+0

你使用了哪种序列化?AFAIK一些形式像二进制有这个问题,而其他形式如XML不。 – Mehrdad 2011-01-23 20:37:32

+0

我正在使用BinaryFormatter序列化。 – PedroC88 2011-01-23 20:57:49

回答

1

我一直运行系列化测试,来到同意@Mehrdad关于一些序列化过程支持现在有新成员的反序列化对象(尽管他说的是反向)。

就像Marc Gravell解释的,BinaryFormatter序列化似乎确实支持Version Tolerant反序列化,我还测试了它可以使用XMLSerialization。请注意,XMLSerialization仅对公共成员进行序列化和反序列化。

SoapFormatter另一方面不支持这种类型的行为,并且在用新添加的成员反序列化对象时会引发异常。

我还没有运行过自定义序列化的测试,但由于它的本质,目的和设计,它也应该是它自己的版本。

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

2

Mspress说的相反。序列化这个类,删除一个成员,反序列化,这是行不通的。基本上它会读取流中的成员,并在找不到时抛出异常。其他方式不关心是否有字段不在流中。

2

BinaryFormatter是(坦率地说)很挑剔,但加入version tolerant serialization - 在想法是简单地添加[OptionalField]到您预计空这些字段。

但是,如果你说它反序列化为空,也许这证明太痛苦了,而且它们暗淡地使默认行为成为“可选”。

注意的BinaryFormatter的许多弱点(加上一个事实,即它不是独立于平台)是为什么我只是不使用它; p