[OptionalField]和[NonSerialized]之间有什么区别?

时间:2010-04-06 16:26:09

标签: c# .net nonserializedattribute

我在transcender上遇到了这个问题:

如果在反序列化期间不需要其值,您应该对字段应用什么?

Me = [NonSerialized],ANSWER = [OptionalField]

我的直觉反应是NonSerialised,但Transcender说我错了。就[非自动化]属性而言,我很清楚要注意什么,但我仍然希望这一点得到澄清。

据我所知,前者与同一程序集的较新版本和旧版本之间的版本冲突有关系。后者更关心的是没有序列化字段FULLSTOP。还有什么可以将这两者分开吗? MSDN并没有真正说明这一点,因为它们都使用XMLIgnoreAttribute在BinaryFormatters和SoapFormatter上与XMLFormatter一起使用。

我的第二个问题是你可以混合搭配两个属性中的任何一个吗?我还没有使用它们。

只是抛出这个,但我的回答是否与[OnDeserialized]和IdeserilizationCallback接口的实现方式有关?

更新

我知道可选字段属性不会序列化数据成员持有的值,但NonSerialized甚至不会序列化数据成员或其值。

2 个答案:

答案 0 :(得分:6)

这两个属性用于序列化方程的相反侧。

当你使用[NonSerialized]时,你会说“这个字段根本不应该被序列化” - 所以它更像是一个“节省时间”属性。基本上,您说该字段对于对象的序列化状态无关紧要。

另一方面,当您使用[OptionalField]时,您仍然会对字段进行序列化。但是,如果该字段缺少 读取时间(当流被反序列化为对象时),则不会引发异常。此属性实际上旨在允许您向现有可序列化类型添加新字段,而不会破坏兼容性。该对象的旧版本(缺少该字段)将被正常反序列化。

答案 1 :(得分:1)

在这种情况下,只需播放英语,不需要可选意味着同样的事情。

对于你的第一个问题,你几乎把它钉在头上。 [OptionalField]基本上允许较旧的序列化与较新的定义兼容。 [NonSerialized]表示您无法在序列化数据中找到它。

鉴于存在差异,我无法想象你为什么要将两者放在一个字段上,但我猜想编译器会抱怨。