在WCF中使用而不是有什么好处
使用DataContract有什么好处?
在Dan Rigsby的博客上看到XmlSerializer和DataContractSerializer的一个很好的比较 。
一些赞成DataContractSerializer的观点:
- 比XmlSerializer快10%左右
- 将序列化用
[DataMember]
修饰的任何内容 – 即使它不是public
可见的 - 除非您明确告知(“选择加入”), 否则不会序列化任何内容
- 您可以使用
[DataMember]
上的Order=
属性定义元素序列化的Order=
- 不需要无参数构造函数来进行反序列化
其他人有一个问题尚未得到解答: 如果您使用[Serializable]
但仍然使用DataContractSerializer
序列化该类型该怎么办? 是否与使用DataContractSerializer
序列化[DataContract]
类型有什么不同?
答案 :它绝对没有区别! 原因是当您将任何支持的类型传递给DataContractSerializer
,在第一个序列化或反序列化集上,它将类型“碎化”为包含有关类型成员等的所有信息的内部结构。然后使用缓存的内部结构(使用动态IL保留)用于后续序列化剧集,永远不会回到原始类型。
此外,如果您正在比较DataContractSerializer
的[Serializable]
类型的序列化与XmlSerializer
对这些相同类型的序列化,您会发现DataContract
的序列化要快得多。 在此处提供的性能对比白皮书中可以看到一点: http : //msdn.microsoft.com/en-us/library/bb310550.aspx
您还可以记住,DataContract比XmlSerializer更面向消费者。
虽然XmlSerializer具有纯技术维度(“我如何将此对象转换为XML”),但DataContract是面向公众的业务概念表示。
因此,DataContract会提醒您,您对class级所做的每项更改都会对消费者产生影响,并且您会受到此合同的约束。 从概念上讲,DataContract是服务架构的核心元素,XmlSerializer只是一个帮手。
除了语法差异和次要特征之外,如果您所做的只是从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
... James Sunderland ...
…或者进入JSON:
JSON
{ "Company": { "Name": "...", "People": [ { "FirstName": "James", "LastName": "Sunderland" }, ... ] } }
…或任何任意数据交换格式,只要您拥有该格式的序列化程序。
这非常强大且灵活,特别是如果您拥有由多种类型的客户端和同级服务器使用的Web服务,或者您的Web服务的使用者组在将来需要扩展:
- JSON在JavaScript和PHP服务器(或任何动态语言)中更容易序列化/反序列化,
- 在WCF客户端中序列化/反序列化更简单。
如果您不想将自己限制为XML作为应用程序体系结构中唯一的数据交换格式,我建议您使用DataContract。 否则,Serializable仅对XML有用。
XmlSerializer将.NET类型序列化为XML的关键问题
- 只有公共字段或.NET类型的属性可以转换为XML
- 只有实现IEnumerable接口的类
- 实现IDictionary接口的类,例如Hash表无法序列化DataContractSerializer和XMLSerializer之间的重要区别
DataContractSerializer设计的实际好处是比Xmlserializer更好的性能。
- XML序列化不指示哪种类型的字段或属性被序列化为XML而DataCotractSerializer
- 显式地显示哪些字段或属性被序列化为XML
- DataContractSerializer可以将HashTable转换为XML
虽然这个问题已经很久了,但我会总结一下我的理解:
1)Datacontract为您提供了使用(DataMember)属性序列化某些成员或字段的灵活性。 2)您可以使用DataContract决定对象的序列化顺序。
除了显而易见的事情,因为DataContract序列化您的公共成员,而Serializable将默认序列化您的字段。