使用DataContract有什么好处?
答案 0 :(得分:35)
在Dan Rigsby的博客上查看精彩的comparison of XmlSerializer and DataContractSerializer。
支持DataContractSerializer的一些观点:
[DataMember]
修饰的任何内容 - 即使它不是public
可见Order=
[DataMember]
属性定义元素序列化的顺序
答案 1 :(得分:11)
有一个问题尚未得到其他人的回答:如果您使用[Serializable]
但仍然使用DataContractSerializer
来序列化该类型该怎么办?与使用[DataContract]
序列化DataContractSerializer
类型有什么不同?
答案:它使绝对没有区别!原因是当您将任何支持的类型传递给DataContractSerializer
时,在第一个序列化或反序列化集上,它会将类型“粉碎”为包含有关类型成员等的所有信息的内部结构。然后使用缓存的内部结构(使用动态IL保留)用于后续的序列化剧集,永远不会回到原始类型。
此外,如果您要比较DataContractSerializer
类型的[Serializable]
类型与XmlSerializer
这些相同类型的序列化,您会发现DataContract
的序列化要快得多。在此处提供的性能比较白皮书中可以看到一点:http://msdn.microsoft.com/en-us/library/bb310550.aspx
答案 2 :(得分:3)
您还可以记住,DataContract比XmlSerializer更加面向消费者。
虽然XmlSerializer具有纯技术维度(“我如何将此对象转换为XML”),但DataContract是面向公众的业务概念表示。
因此,DataContract会提醒您,您对班级所做的每项更改都会对消费者产生影响,并且您受此合约的约束。从概念上讲,DataContract是服务架构的核心元素,XmlSerializer只是一个帮手。
答案 3 :(得分:3)
除了语法差异和次要功能之外,如果您所做的只是从XML序列化和反序列化,那么没有真正的比较基础。 DataContract比Serializable最强大的优势 - 每个人似乎都跳过了 - 是数据合同不是特定于XML的。
使用数据合同时,只有两种逻辑结构:数据合同和数据成员(数据合同的成员)。数据合同中没有"元素"或" xml元素"。
理论上,基于数据协定的序列化使得对象结构能够以任何数据交换格式表示,尽管目前在.NET框架中仅提供AFAIK XML和JSON序列化/反序列化。但是,创建一个序列化器肯定是可以的,而不是像RDF一样运行,我怀疑还有其他的序列化器。
考虑以下简单架构:
<强> C#强>
[DataContract]
class Company
{
[DataMember]
public string Name { get; set }
[DataMember]
public Person[] People { get; set }
}
[DataContract]
class Person
{
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
}
此合约不是特定于XML的。您没有指定任何与XML相关的内容。您可以将上述体系结构的实例序列化为XML:
<强> XML 强>
<Company>
<Name>...</Name>
<People>
<Person>
<FirstName>James</FirstName>
<LastName>Sunderland</LastName>
</Person>
...
</People>
</Company>
...或JSON:
<强> JSON 强>
{
"Company": {
"Name": "...",
"People": [
{
"FirstName": "James",
"LastName": "Sunderland"
},
...
]
}
}
...或任意数据交换格式,只要您拥有该格式的序列化程序。
这是非常强大和灵活的,特别是如果您有多个类型的客户端和同行使用的Web服务,或者您的Web服务的使用者组将来会扩展:
如果您不想将自己限制为XML作为应用程序架构中唯一的数据交换格式,我建议您使用DataContract。否则,Serializable对于XML仅稍微有用。
答案 4 :(得分:2)
XmlSerializer将.NET类型序列化为XML的关键问题
DataContractSerializer设计的实际好处是比Xmlserializer更好的性能。
答案 5 :(得分:1)
虽然这个问题很陈旧,但我会总结一下我的理解:
1)Datacontract为您提供了使用(DataMember)属性序列化某些成员或字段的灵活性。 2)您可以使用DataContract决定对象的序列化顺序。
除了显而易见的事情,因为DataContract会序列化您的公共成员,而Serializable将默认序列化您的字段。