5

我已经看了一段时间了

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

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

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

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

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

4

2 回答 2

11

Dan Rigsby 有一篇关于XmlSerializer 与 DataContractSerializer的非常好的比较文章,还涉及 NetDataContractSerializer。

数据合同序列化器:

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

您明确地告诉 DCS要序列化什么,但对它的完成方式没有太大影响。

XmlSerializer

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

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

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

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

于 2009-12-29T21:29:46.683 回答
2

Marc Gravell 在他的博客上展示了他使用 DataContractSerializer、XmlSerializer 和大多数其他 .NET 序列化程序(包括 protobuf-net(他创建的 .NET 协议缓冲区的实现))进行的基准测试的结果。

于 2010-01-29T22:16:05.843 回答