代码之家  ›  专栏  ›  技术社区  ›  JustAMartin

C#-使用哪些属性来支持同时使用XMLSerializer和DataContractSerializer进行序列化?

  •  4
  • JustAMartin  · 技术社区  · 16 年前

    我有一些简单的POCO对象:

    public class ProductCategoryDTO
    {
            public string Name { get; set; }
            public DateTime ModifiedDate { get; set; }
    }
    

    现在我很困惑,我应该为类和每个字段使用什么属性。我知道:

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   marc_s MisterSmith    16 年前

    [DataContract(Namespace="....")]
    [XmlType]
    public class ProductCategoryDTO
    {
            [DataMember(Order=1)]
            [XmlElementAttribute(Order=1)]
            public string Name { get; set; }
    
            [DataMember(Order=2)]
            [XmlElementAttribute(Order=2)]
            public DateTime ModifiedDate { get; set; }
    }
    
        2
  •  6
  •   Marc Gravell    16 年前

    严格地 我说,你不知道 需要 使用任一属性-p过去是这样的 DataContractSerializer 要求 [DataContract] [DataMember] (他们绝对 应该 可以 不使用它(但它的行为非常可疑,类似于 BinaryFormatter ). 同样地 XmlSerializer 不 需要 除非你想控制一切。但是,您应该注意到一些差异:

    • 要求(并使用)公共无参数构造函数; 数据序列化程序 不使用 一个构造器。所以请注意这一点,不要(对于WCF)依赖于ctor中的代码-如果您有必要的初始化代码,请使用WCF的序列化回调。
    • XmlSerializer 要求公共字段(yeuch)或同时具有这两个字段的公共属性 get set (即使是名单); 数据序列化程序 将愉快地与私人成员、公共财产(例如)合作 得到 私人的 设置 ,及藏品
    • XmlSerializer 数据序列化程序 他不那么挑剔

    并行 ,但如果希望完全兼容,请注意上面的内容。

    另一个选择是只使用 ; 您可以将WCF配置为使用 XmlSerializer 利用 [XmlSerialzerFormat] [XmlInclude] 和 [KnownType] .

    IXmlSerializable ,这两种方法都优先于这两种方法,但很难做到正确。除非有必要,否则不要那样做。

        3
  •  1
  •   Darin Dimitrov    16 年前

    XML元素的顺序应该由WSDL决定,您无需担心。从.NET3.5SP1开始,您不再需要使用 DataContractAttribute 和 DataMemberAttribute XmlSerializer SerializableAttribute 没有效果。此属性用于 BinaryFormatter

    推荐文章