[Misc]序列化与反序列化 - Gukie/learning GitHub Wiki

refer

https://www.jianshu.com/p/2140b1cac553

序列化框架对性能指标

主要在空间与时间上进行考量

  • 空间: 由于序列化数据的时候,需要加上额外的数据,方便反序列化的时候进行解析,这就增加了数据的空间;
  • 时间: 解析数据的时候,所花的时间; 结构越复杂,花的时间就越多

几种序列化协议的对比

  • 3.2.1 XML

(1)优点

人机可读性好

可指定元素或特性的名称

(2)缺点

序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息。

类必须有一个将由 XmlSerializer 序列化的默认构造函数。

只能序列化公共属性和字段

不能序列化方法

文件庞大,文件格式复杂,传输占带宽

(3)使用场景

当做配置文件存储数据

实时数据转换

  • 3.2.2 JSON

(1)优点

前后兼容性高

数据格式比较简单,易于读写

序列化后数据较小,可扩展性好,兼容性好

与XML相比,其协议比较简单,解析速度比较快

(2)缺点

数据的描述性比XML差

不适合性能要求为ms级别的情况

额外空间开销比较大

(3)适用场景(可替代XML)

跨防火墙访问

可调式性要求高的情况

基于Web browser的Ajax请求

传输数据量相对小,实时性要求相对低(例如秒级别)的服务

  • 3.2.3 Thrift

(1)优点

序列化后的体积小, 速度快

支持多种语言和丰富的数据类型

对于数据字段的增删具有较强的兼容性

支持二进制压缩编码

(2)缺点

使用者较少

跨防火墙访问时,不安全

不具有可读性,调试代码时相对困难

不能与其他传输层协议共同使用(例如HTTP)

无法支持向持久层直接读写数据,即不适合做数据持久化序列化协议

(3)适用场景

分布式系统的RPC解决方案

  • 3.2.4 ProtoBuf

(1)优点

序列化后码流小,性能高

结构化数据存储格式(XML JSON等)

通过标识字段的顺序,可以实现协议的前向兼容

结构化的文档更容易管理和维护

(2)缺点

需要依赖于工具生成代码

支持的语言相对较少,官方只支持Java 、C++ 、Python

(3)适用场景

对性能要求高的RPC调用

具有良好的跨防火墙的访问属性

适合应用层对象的持久化

序列化性能对比:(一百万次SerializeModel的序列化)

字节流大小(byte)序列化耗时(ms)反序列化耗时(ms)

protoBuf41452197

gson13725501655

fastjson1376541020

jackson1378951122

java原生23616471626

thrift(TBinaryProtocol)66562555

thrift(TCompactProtocol)41492657

thrift(TJSONProtocol)13232943678

thrift(TSimpleJSONProtocol)1342742

作者:wy_sure 链接:https://www.jianshu.com/p/2140b1cac553 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。