为什么二进制序列化比xml序列化更快?

sur*_*aik 11 .net c# xml serialization

为什么二进制序列化被认为比xml序列化更快?

Dan*_*dor 14

考虑序列化double,例如:

  • 二进制序列化:从内存地址写入8个字节到流

  • 二进制反序列化:读取相同的8个字节

  • xml序列化:编写标记,转换为文本,编写结束标记 - 几乎三倍的I/O和1000倍的CPU利用率

  • xml反序列化:标记读取/验证,读取字符串将其解析为数字,读取/验证结束标记.I/O的开销稍微增加,而CPU的开销则更多

  • 人们还可以提到通常在文本格式的序列化或反序列化期间创建的字符串对象的内存管理.这可以将事情从CPU缓存中推出,或者导致垃圾收集算法启动或捶打. (2认同)

RRU*_*RUZ 9

二进制序列化更有效,因为直接写原始数据和XML需要格式,并解析数据以生成有效的XML结构,此外,根据您的对象的数据类型,XML可能具有大量冗余数据.


Mar*_*ell 9

实际上,就像所有事情一样 - 它取决于数据和序列化器.

通常(虽然可能是不明智的)人们的意思BinaryFormatter是"二元",但这有许多不足之处:

  • 添加了大量的类型元数据(这些都需要空间)
  • 默认情况下,它包含字段名称(可以是详细的,特别是对于自动实现的属性)

相反,xml通常具有以下开销:

  • 标签添加空间和IO
  • 需要解析标签(非常昂贵)
  • 大量的文本编码/解码

当然,xml很容易压缩,增加了CPU但却大大减少了带宽.

但这并不意味着一个人更快; 我会从这里向您推荐一些示例统计数据(包括完整源代码),我已经注释了序列化程序库(二进制文件,xml,文本等).特别注意前两个结果; 它看起来像是在XmlSerializer压倒BinaryFormatter每一个价值,同时保留了跨平台的优势.当然,protobuf然后胜过XmlSerializer; p

这些数字与ServiceStack的基准测试非常吻合.

BinaryFormatter *** binary
Length: 1314
Serialize: 6746
Deserialize: 6268

XmlSerializer *** xml
Length: 1049
Serialize: 3282
Deserialize: 5132

DataContractSerializer *** xml
Length: 911
Serialize: 1411
Deserialize: 4380

NetDataContractSerializer *** binary
Length: 1139
Serialize: 2014
Deserialize: 5645

JavaScriptSerializer *** text (json)
Length: 528
Serialize: 12050
Deserialize: 30558

(protobuf-net v2) *** binary
Length: 112
Serialize: 217
Deserialize: 250
Run Code Online (Sandbox Code Playgroud)