XML序列化 - 何时使用DataContractSerializer / 二进制 / XMLSerialiser

5
我已经仔细研究了这个问题。
似乎二进制序列化被认为是不推荐的,因为任何字段名称的更改都会破坏序列化=?不好。
XML序列化器存在问题,因为您必须提供一个无参构造函数和公共字段,尽管您对元素作为属性或元素以及它们的命名有更多的控制。
DataContractSerializer很好,但所有的子类都需要明确添加,这是个遗憾。
然而,我偶然发现NetDataContractSerializer没有这个限制。
如果您要进行C#序列化并且没有太大的xml大小限制,那么使用NetDataContractSerializer总是一种好方法吗?
2个回答

11

Dan Rigsby在他的博客上撰写了一篇很好的比较文章XmlSerializer和DataContractSerializer的序列化方式,同时也涉及到了NetDataContractSerializer。

DataContractSerializer:

  • 速度快 - 比XmlSerializer快约10%
  • 可互操作 - 与Java、Ruby等完美配合使用
  • 采用显式“选择加入”模型 - 需要标记需要进行序列化的内容
  • 不需要任何构造函数
  • 可以序列化非公共成员和内部字段
  • 不支持XML节点上的属性

您需要明确告诉DCS 什么需要序列化,但是对于如何执行序列化过程,您的影响有限。

XmlSerializer

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

您可以清楚地告诉XmlSerializer如何和什么进行序列化,但是您无法序列化所有内容 - 只能序列化公开可见的属性。

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

这是一项艰难的权衡 - 像往常一样。绝对要远离任何二进制格式器-那不是向后兼容的,脆弱且注定会给您带来麻烦-使用其中一个标准方式进行操作。哪种方法最适合您的特定情况真的很难说-您需要自己找出答案....


2
Xml Serializer 也非常互操作。主要缺点是编程模型上的限制或约束 (必须有默认构造函数进行序列化,数据必须为公共类型等)。另外,XML序列化器还会序列化公共字段,除了属性之外。 - Cheeso

2
Marc Gravell在他的博客上展示了他使用DataContractSerializer、XmlSerializer以及其他大多数.NET序列化程序进行的基准测试结果,包括他创建的protobuf-net(用于.NET的Protocol Buffers实现)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接