序列化/反序列化对象-字段的顺序重要吗?

7

DataContractSerializer是否会错误地反序列化对象,如果字段不按“正确”(无论是什么意思)顺序排列?

我尝试序列化/反序列化的类没有在字段/属性上放置顺序属性。然而,我的一个字段总是被反序列化为null,即使它有一个非空值(实际上包含一个字符串列表)。

当我移动序列化文件中的两个XML元素以匹配另一个XML示例中的顺序时(该示例的反序列化没有问题),一切都开始正常工作。

这对我来说毫无意义,但也许有人知道得更好。;)

1个回答

16

要使类能够被 DataContractSerializer 正确序列化/反序列化,必须满足以下条件:

  1. 需要对要序列化的类设置 SerializableAttributeDataContractAttribute
  2. 需要对要序列化的类的属性和字段设置 DataMemberAttribute
  3. 可序列化的属性或字段的数据类型必须是可序列化的(即具有公共构造函数并继承自 ISerializable);
  4. 要序列化的类必须实现 IExtensibleDataObject 接口;
  5. 注意:可序列化的字段可以是公共的或私有的。
  6. 成员必须按字母顺序排列,或者您可以使用 DataMemberAttributeOrder 属性

因此,声明的顺序确实很重要。如果成员没有按字母顺序排列,则会被跳过。查看 StackOverflow 上的此答案,也许适用于您的情况。


1
从.NET 3.5 SP1开始,第一条和第二条规则可以省略。 - JustAMartin
@Martin:你确定吗?例如,对于需要可序列化的 Web 服务,在 .NET 4.0 中仍需要 DataMemberAttribute。你有参考链接吗?我很想了解更多(然后更新我的答案)。 - Abel
规则6中的链接已失效。 - bkribbs
@bkribbs,谢谢,我已经找到了一个类似内容的不同链接,显然那个网站已经失效了。 - Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接