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

时间:2011-01-25 10:19:01

标签: c# .net wcf serialization

使用DataContract有什么好处?

6 个答案:

答案 0 :(得分:35)

在Dan Rigsby的博客上查看精彩的comparison of XmlSerializer and DataContractSerializer

支持DataContractSerializer的一些观点:

  • 比XmlSerializer快10%左右
  • 将序列化使用[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服务的使用者组将来会扩展:

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

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

答案 4 :(得分:2)

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

  • 只能将公共字段或.NET类型的属性翻译成XML
  • 仅实现IEnumerable接口的类
  • 无法序列化实现IDictionary接口的类,例如Hash表 DataContractSerializer和XMLSerializer之间的重要区别

DataContractSerializer设计的实际好处是比Xmlserializer更好的性能。

  • XML序列化未指明该类型的哪些字段或属性已序列化为XML而DataCotractSerializer
  • 明确显示哪些字段或属性序列化为XML
  • DataContractSerializer可以将HashTable转换为XML

答案 5 :(得分:1)

虽然这个问题很陈旧,但我会总结一下我的理解:

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

除了显而易见的事情,因为DataContract会序列化您的公共成员,而Serializable将默认序列化您的字段。