【问题标题】:XML Serialisation - When To Use DataContractSerializer / Binary / XMLSerialiserXML 序列化 - 何时使用 DataContractSerializer / Binary / XMLSerializer
【发布时间】:2009-12-29 21:25:07
【问题描述】:

我已经看了一段时间了

似乎不鼓励二进制序列化,因为对字段名称的任何更改都会破坏序列化 =?不好

XMLSerializer 是有问题的,因为您必须提供无参数构造函数和公共字段,尽管您确实可以更好地控制作为属性或元素的元素及其命名

DataContractSerializer 很好,但所有子类都需要显式添加,这很遗憾

但是我偶然发现了没有此限制的 NetDataContractSerializer。

如果您的目标是 C# 序列化,并且对 xml 的大小没有大的限制,那么 NetDataContractSerializer 总是要走的路吗??

【问题讨论】:

    标签: c# datacontractserializer xmlserializer


    【解决方案1】:

    Dan Rigsby 在 XmlSerializer vs. DataContractSerializer 上有一篇非常好的比较文章,还涉及到 NetDataContractSerializer。

    DataContractSerializer:

    • 速度很快 - 比 XmlSerializer 快 10% 左右
    • 它具有互操作性 - 可与 Java、Ruby 完美配合 - 随你便
    • 使用明确的“选择加入”模型 - 您需要标记要序列化的内容
    • 不需要任何构造函数
    • 可以序列化非公共成员和内部字段
    • 不支持 XML 节点上的属性

    您明确告诉 DCS 什么要序列化,但您对如何完成并没有太大影响。

    XmlSerializer

    • 仅序列化公共字段和属性
    • 序列化除您排除的那些之外的所有内容(选择退出模型)
    • 支持属性和一切
    • 它具有互操作性 - 可与 Java、Ruby 完美配合 - 随你便
    • 需要无参数构造函数进行反序列化

    您非常清楚地告诉 XmlSerializer 序列化的方式和内容,但您无法序列化所有内容 - 只能序列化公开可见的属性。

    NetDataContractSerializer 有点奇怪 - 它不能互操作,只有在两端都是 .NET 时才有效 - 它在消息中包含 .NET 类型信息(使其更大)。您不能以声明方式将其添加到“开箱即用”的 WCF 服务中。

    这是一个艰难的权衡 - 一如既往。绝对远离任何二进制格式化程序——它不向后兼容、脆弱,而且一定会让你头疼——使用其中一种标准方法。哪一个是您给定场景的“最佳”真的很难说 - 您必须自己弄清楚那个......

    【讨论】:

    • Xml Serializer 的互操作性也很强。主要的缺点是编程模型的限制或约束(我们必须有默认的ctor,要序列化,数据必须是公共的,等等)。 ps:除了属性之外,XML 序列化器还会序列化公共字段
    【解决方案2】:

    Marc Gravell 在他的博客 the results of a benchmark 上展示了他使用 DataContractSerializer、XmlSerializer 和大多数其他 .NET 序列化程序,包括 protobuf-net(他创建的 .NET 协议缓冲区的实现)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2018-06-14
      相关资源
      最近更新 更多