C# - 使用XMLSerializer和DataContractSerializer来支持序列化的属性是什么?

Jus*_*tin 4 c# attributes datacontractserializer

我有一些简单的POCO对象:

public class ProductCategoryDTO
{
        public string Name { get; set; }
        public DateTime ModifiedDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

由于有时字段顺序很重要(例如,如果发送到Infopath表单),我需要在序列化时保持元素顺序.

现在我很困惑,我应该为班级和每个领域使用什么属性.我知道:

  • DataContractSerializer使用[DataContract]和[DataMember(Order = n)]
  • XMLSerializer使用[Serializable]和[XmlElementAttribute(Order = n)].

然后,如果我想支持XMLSerializer和DataContractSerializer,那么要使用哪些属性,因此它可以在WCF或ASP中使用.网页服务?

Mar*_*ell 6

严格来说,你不需要使用任何属性;-p它曾经是DataContractSerializer需要[DataContract]/ [DataMember](并且它们绝对应该被使用),但你可以不使用它(但它然后以非常可疑的方式使用它)类似于BinaryFormatter).同样地,XmlSerializer并不需要,除非你想控制一切东西.但是,您应该注意一些差异:

  • XmlSerializer要求(和使用)公共无参数构造函数; DataContractSerializer 不使用构造函数(根本).所以要小心,不要(对于WCF)依赖ctor中的代码 - 如果你有必要的初始化代码,请使用WCF的序列化回调.
  • XmlSerializer要求公共领域(yeuch)或公共财产两者getset(甚至列表); DataContractSerializer很乐意对私人成员,属性(例如)公共get和私有set,以及没有 `集合的集合(只要你的类型初始化它).
  • XmlSerializer要求公共类型; IIRC DataContractSerializer不那么挑剔

是的 您可以同时支持两个序列化程序,并且可以并行添加任意数量的属性,但如果您想要完全兼容,请注意上述内容.

另一种选择是使用XmlSerializer; 您可以配置WCF使用XmlSerializer使用[XmlSerialzerFormat].这两个选项都支持继承,via [XmlInclude][KnownType].

最后,请注意,如果您实现IXmlSerializable,这优先于任何一个,但很难做到正确.除非必须这样做,否则不要这样做.