我有一些简单的POCO对象:
public class ProductCategoryDTO
{
public string Name { get; set; }
public DateTime ModifiedDate { get; set; }
}
由于有时字段顺序很重要(例如,如果发送到Infopath表单),我需要在序列化时保持元素顺序。
现在我很困惑,我应该为班级和每个领域使用什么属性。我知道:
如果我想同时支持XMLSerializer和DataContractSerializer,那么使用什么属性,因此它可以在WCF或ASP中使用。网络服务?
答案 0 :(得分:6)
严格说,你不需要使用任何属性;-p曾经是DataContractSerializer
要求{{1} } / [DataContract]
(并且它们绝对应该使用),但是你可以使用它(但它然后以非常可疑的方式行事,类似于{{ 1}})。同样,[DataMember]
除非您想要控制事物,否则 但是,您应该注意一些差异:
BinaryFormatter
要求(并使用)公共无参数构造函数; XmlSerializer
不使用构造函数(根本不是)。所以要小心,不要(对于WCF)依赖ctor中的代码 - 如果你有必要的初始化代码,请使用WCF的序列化回调。XmlSerializer
要求公共字段(yeuch)或同时包含DataContractSerializer
和XmlSerializer
的公共属性(即使是列表); get
很乐意与私人成员,属性(例如)公开set
和私有DataContractSerializer
以及集合而不是一套(只要你的类型初始化它。)。get
要求公共类型; IIRC set
不那么挑剔是的;您可以同时支持两个序列化程序,并且可以并行添加任意数量的属性,但如果您想要完全兼容,请注意以上内容。
另一种选择是使用XmlSerializer
;您可以使用DataContractSerializer
将WCF配置为使用XmlSerializer
。这两个选项都通过XmlSerializer
和[XmlSerialzerFormat]
支持继承。
最后,请注意,如果您实施[XmlInclude]
,则优先于其中之一,但很难做到正确。除非必须这样做,否则不要这样做。
答案 1 :(得分:3)
如果你真的必须,我没有看到为什么你不能在类和成员属性上放置这两个属性的任何理由。看起来不太好,但是如果它适合你,那就没关系了!
[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 :(得分:1)
XML元素的顺序应该由WSDL决定,您不必担心它。从.NET 3.5 SP1开始,您不再需要使用DataContractAttribute和DataMemberAttribute。序列化程序将自动包含所有公共属性。就XmlSerializer而言,SerializableAttribute无效。此属性用于BinaryFormatter的二进制序列化。因此,要继续,您可以将该类保留为POCO,在WCF或ASP.NET Web服务中公开它,并让客户端根据WSDL使用它。