XmlSerializer和BinaryFormatter之间有什么区别

ahs*_*ele 48 .net c# serialization xml-serialization binary-serialization

我上周花了很长时间研究序列化.在那段时间里,我发现了很多使用BinaryFormatter或XmlSerializer的例子.不幸的是,我没有找到任何全面详细说明两者之间差异的例子.

我的好奇心的起源在于为什么BinaryFormatter能够直接反序列化到接口而XmlSerializer不能.Jon Skeet在回答" 在运行时转换为多个(未知类型) "时提供了直接二进制序列化到接口的示例.Stan R.在他对" XML Object Deserialization to Interface "的回答中使用XmlSerializer为我提供了实现目标的方法.

除了明显的BinaryFormatter利用二进制序列化,而XmlSerializer使用XML我想更全面地理解基本差异.何时使用其中一种或各自的利弊.

Dus*_*ges 93

二进制格式化程序能够直接反序列化为接口类型的原因是因为当一个对象最初被序列化为二进制流时,包含类型和组件信息的元数据会被对象数据卡住.这意味着当二进制格式化程序反序列化它知道其类型的对象时,构建正确的对象,然后可以将其强制转换为该对象实现的接口类型.

另一方面,XML序列化程序只是序列化到一个模式,只序列化对象的公共字段和值,除此之外没有类型信息(例如,类型实现的接口).

这是一篇很好的帖子,.NET Serialization,比较了BinaryFormatter,SoapFormatterXmlSerializer.我建议您查看下表,除了前面提到的序列化程序外,还包括DataContractSerializer,NetDataContractSerializerprotobuf-net.

序列化比较

  • 我认为"最佳表现"分类是错误的.二进制格式化程序是.net中表现最差的序列化程序(除了soap格式化程序).至少这是大多数基准测试所显示的:http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx,http:// james. newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx,http://techmikael.blogspot.com/2010/01/net-serialization-performance.html (5认同)
  • @joniba 最佳性能始终取决于使用情况,XML 不会重用元素,因此任何具有大量共享引用的数据集在 XML 过程中都会有大量重复,这会降低性能,但使用平面对象的测试将有利于 XML (2认同)

Mar*_*ell 6

只是为了权衡......

两者之间的明显区别是"二进制vs xml",但确实比这更深入:

  • fields(BinaryFormatter= bf)vs public members(通常是属性)(XmlSerializer= xs)
  • 基于类型元数据(bf)与基于合同(xs)
  • version-brittle(bf)vs版本容忍(xs)
  • "graph"(bf)vs"tree"(xs)
  • .NET特定(bf)与便携式(xs)
  • opaque(bf)vs human-readable(xs)

讨论为什么BinaryFormatter会变脆,请看这里.

讨论哪个更大是不可能的; 所有类型的元数据都BinaryFormatter可以使它更大.并且XmlSerializer可以像gzip一样非常适合压缩.

但是,可以利用每个人的优势; 例如,谷歌开源了他们自己的数据序列化格式,"协议缓冲区".这是:

  • 合同为基础
  • 便携式(参见实施列表)
  • 版本容错
  • 基于树
  • 不透明(尽管有一些工具可以在与.proto结合使用时显示数据)
  • 通常是" 先收缩 ",但有些实现允许基于反射的隐式契约

但重要的是,它是非常密集的数据(没有类型元数据,纯二进制表示,短标签,变种长度base-7编码等技巧),并且处理效率很高(没有复杂的xml结构,没有与成员匹配的字符串等等) ).

我可能有点偏颇; 我维护了一个实现(包括几个适用于C#/ .NET),但你会注意到我没有链接到任何特定的实现; 格式符合其自身的优点;-p