我在transcender上遇到了这个问题:
如果在反序列化期间不需要其值,您应该对字段应用什么?
Me = [NonSerialized],ANSWER = [OptionalField]
我的直觉反应是NonSerialised,但Transcender说我错了。就[非自动化]属性而言,我很清楚要注意什么,但我仍然希望这一点得到澄清。
据我所知,前者与同一程序集的较新版本和旧版本之间的版本冲突有关系。后者更关心的是没有序列化字段FULLSTOP。还有什么可以将这两者分开吗? MSDN并没有真正说明这一点,因为它们都使用XMLIgnoreAttribute在BinaryFormatters和SoapFormatter上与XMLFormatter一起使用。
我的第二个问题是你可以混合搭配两个属性中的任何一个吗?我还没有使用它们。
只是抛出这个,但我的回答是否与[OnDeserialized]和IdeserilizationCallback接口的实现方式有关?
更新
我知道可选字段属性不会序列化数据成员持有的值,但NonSerialized甚至不会序列化数据成员或其值。
答案 0 :(得分:6)
这两个属性用于序列化方程的相反侧。
当你使用[NonSerialized]
时,你会说“这个字段根本不应该被序列化” - 所以它更像是一个“节省时间”属性。基本上,您说该字段对于对象的序列化状态无关紧要。
另一方面,当您使用[OptionalField]
时,您仍然会对字段进行序列化。但是,如果该字段缺少 读取时间(当流被反序列化为对象时),则不会引发异常。此属性实际上旨在允许您向现有可序列化类型添加新字段,而不会破坏兼容性。该对象的旧版本(缺少该字段)将被正常反序列化。
答案 1 :(得分:1)
在这种情况下,只需播放英语,不需要和可选意味着同样的事情。
对于你的第一个问题,你几乎把它钉在头上。 [OptionalField]
基本上允许较旧的序列化与较新的定义兼容。 [NonSerialized]
表示您无法在序列化数据中找到它。
鉴于存在差异,我无法想象你为什么要将两者放在一个字段上,但我猜想编译器会抱怨。