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,SoapFormatter和XmlSerializer.我建议您查看下表,除了前面提到的序列化程序外,还包括DataContractSerializer,NetDataContractSerializer和protobuf-net.

只是为了权衡......
两者之间的明显区别是"二进制vs xml",但确实比这更深入:
BinaryFormatter= bf)vs public members(通常是属性)(XmlSerializer= xs)讨论为什么BinaryFormatter会变脆,请看这里.
讨论哪个更大是不可能的; 所有类型的元数据都BinaryFormatter可以使它更大.并且XmlSerializer可以像gzip一样非常适合压缩.
但是,可以利用每个人的优势; 例如,谷歌开源了他们自己的数据序列化格式,"协议缓冲区".这是:
但重要的是,它是非常密集的数据(没有类型元数据,纯二进制表示,短标签,变种长度base-7编码等技巧),并且处理效率很高(没有复杂的xml结构,没有与成员匹配的字符串等等) ).
我可能有点偏颇; 我维护了一个实现(包括几个适用于C#/ .NET),但你会注意到我没有链接到任何特定的实现; 格式符合其自身的优点;-p