[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 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。