C# 在WCF中使用[DataContract]而不是[Serializable]有什么好处

C# 在WCF中使用[DataContract]而不是[Serializable]有什么好处,c#,.net,wcf,serialization,C#,.net,Wcf,Serialization,使用DataContract有什么好处吗?请在Dan Rigsby的博客上看到一篇很棒的文章 以下几点有利于DataContractSerializer: 比XmlSerializer快约10% 将序列化用[DataMember]修饰的任何内容-即使它不是公共的可见 不会序列化任何内容,除非您明确告知(“选择加入”) 您可以使用[DataMember] 反序列化不需要无参数构造函数 将.NET类型序列化为XML的XmlSerializer的关键问题 只有.NET类型的公共字段或属性才能转换为

使用DataContract有什么好处吗?

请在Dan Rigsby的博客上看到一篇很棒的文章

以下几点有利于DataContractSerializer:

  • 比XmlSerializer快约10%
  • 将序列化用
    [DataMember]
    修饰的任何内容-即使它不是
    公共的
    可见
  • 不会序列化任何内容,除非您明确告知(“选择加入”)
  • 您可以使用
    [DataMember]
  • 反序列化不需要无参数构造函数

将.NET类型序列化为XML的XmlSerializer的关键问题

  • 只有.NET类型的公共字段或属性才能转换为XML
  • 只有实现IEnumerable接口的类
  • 无法序列化实现IDictionary接口的类,例如哈希表 DataContractSerializer和XMLSerializer之间的重要区别
DataContractSerializer设计的一个实际好处是性能优于Xmlserializer

  • XML序列化不指示将类型的哪些字段或属性序列化为XML,而DataCotractSerializer
  • 显式显示序列化为XML的字段或属性
  • DataContractSerializer可以将哈希表转换为XML

您还可以记住,DataContract比XmlSerializer更面向消费者

虽然XmlSerializer有一个纯粹的技术维度(“如何将此对象转换为XML”),但DataContract是面向公众的业务概念表示


因此,DataContract提醒您,您对类所做的每一次更改都将对使用者产生影响,并且您受此契约的隐式约束。从概念上讲,DataContract是您的服务体系结构的核心元素,XmlSerializer只是一个助手。

这里还有一个其他人尚未回答的问题:如果您使用
[Serializable]
,但仍然使用
DataContractSerializer
来序列化该类型会怎么样?它与使用
DataContractSerializer
序列化
[DataContract]
类型有什么不同吗

答案:完全没有区别!原因是,当您将任何支持的类型传递给
DataContractSerializer
时,在第一次序列化或反序列化时,它会将该类型“分解”到一个内部结构,该结构包含有关该类型成员等的所有信息。然后,它使用缓存的内部结构(使用动态IL保留)对于后续的序列化片段,永远不要返回原始类型


另外,如果您比较
DataContract
[Serializable]
类型的序列化与
XmlSerializer
的相同类型的序列化,您会发现
DataContract
的序列化速度要快得多。在这里提供的性能比较白皮书中可以看到这一点:

虽然这个问题很老,但我将总结我的理解:

1) Datacontract为您提供了使用(DataMember)属性序列化某些成员或字段的灵活性。 2) 您可以使用DataContract确定对象序列化的顺序


除了DataContract序列化您的公共成员,而Serializable默认情况下将序列化您当前的字段等显而易见的事情之外。

如果您所做的只是序列化到XML并从XML反序列化,那么除了语法差异和次要功能外,没有真正的比较基础。DataContract相对于Serializable(每个人似乎都忽略了这一点)最强大的优势是数据契约不是特定于XML的

使用数据协定时,只有两种逻辑结构:数据协定和数据成员(数据协定的成员)。数据契约中没有“元素”或“xml元素”这样的东西

理论上,基于数据契约的序列化允许对象结构以任何数据交换格式表示,尽管目前.NET framework中只有AFAIK XML和JSON序列化/反序列化可用。然而,当然可以创建一个序列化程序,而不是使用RDF,我怀疑还有其他序列化程序

考虑以下简单的体系结构:

C#

此合同不是特定于XML的。您没有指定任何与XML相关的内容。您可以将上述体系结构的实例序列化为XML:

XML

<Company>
  <Name>...</Name>
  <People>
    <Person>
      <FirstName>James</FirstName>
      <LastName>Sunderland</LastName>
    </Person>
    ...
  </People>
</Company>
。。。或转换为任意数据交换格式,只要您拥有该格式的序列化程序

这是非常强大和灵活的,特别是如果您有一个由多种类型的客户端和对等方使用的Web服务,或者如果您的Web服务的消费群体将来会扩展:

  • JSON在JavaScript和PHP服务器(或任何动态语言)中更容易序列化/反序列化
  • 在WCF客户机中,XML更容易序列化/反序列化

如果您不想将自己限制为XML作为应用程序体系结构中唯一的数据交换格式,我建议您使用DataContract。否则,Serializable仅对XML有用。

这实际上回答了OP的问题。我看不出它如何更好地回答这个问题,所以后续评论对我来说没有意义。选择的答案看起来更精确,但这个答案确实提供了一些附加信息。这是使用DTO时的最佳选择,因为所有内容都需要序列化
<Company>
  <Name>...</Name>
  <People>
    <Person>
      <FirstName>James</FirstName>
      <LastName>Sunderland</LastName>
    </Person>
    ...
  </People>
</Company>
{
    "Company": {
        "Name": "...",
        "People": [
            {
                "FirstName": "James",
                "LastName": "Sunderland"
            },
            ...
        ]
    }
}