在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将默认序列化您的字段。