XML序列化 - 何时使用DataContractSerializer / Binary / XMLSerializer

时间:2009-12-29 21:25:08

标签: c# datacontractserializer xmlserializer

我已经看了一会儿

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

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

DataContractSerializer很好,但需要明确添加所有的分类,这是一种耻辱

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

如果您的目标是C#序列化并且对xml的大小没有大的限制,那么NetDataContractSerializer总是可以去这里吗?

2 个答案:

答案 0 :(得分:11)

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

<强>的DataContractSerializer:

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

你告诉DCS明确要什么来序列化,但你对 的影响没有多大影响。

<强> XmlSerializer的

  • 仅序列化公共字段和属性
  • 序列化您排除的所有内容(退出模型)
  • 支持属性和所有内容
  • 它具有互操作性 - 与Java,Ruby完美配合 - 您可以将其命名为
  • 需要无参数化构造函数进行反序列化

您可以非常清楚地告诉XmlSerializer如何以及如何序列化,但是您无法序列化所有内容 - 只有公开可见的属性。

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

这是一项艰难的权衡 - 一如既往。绝对远离任何二进制格式化程序 - 这不是向后兼容,脆弱,并且必然会让您头疼 - 使用这些标准方法之一。对于你给定的场景,哪一个是“最好的”真的很难说 - 你必须自己想出那个......

答案 1 :(得分:2)

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