6

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

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

我 = [非序列化],答案 = [可选字段]

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

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

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

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

更新:

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

4

2 回答 2

8

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

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

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

于 2010-04-06T16:33:57.977 回答
1

在这种情况下,只是玩英语,不需要可选的意思是一样的。

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

考虑到这些差异,我无法想象你为什么将两者都放在一个字段上,但我猜编译器会抱怨。

于 2010-04-06T16:37:10.797 回答