数据序列化

* 本页面的内容总结和归纳了数据序列化相关的知识点。

在我们实际的开发过程中,尤其是后台研发过程中,序列化是服务和服务之间交互数据时必须接触的一项技能。

一、什么是序列化?

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式(通常为二进制形式)的过程。与之相对应的,反序列化 (Deserialization)是序列化的逆过程,即将序列化之后的数据还原为原来的数据对象,以便后续业务的进行,一般也将反序列化称为解码(Decode)。

通过统一一个数据序列化的协议,我们可以方便的进行数据的传递(序列化成二进制数据流)和持久化存储,使程序更具有维护性。

二、常见的序列化协议有哪些?

在研发过程中,我们最常使用的当指 JSON (Javascript Object Notation)了,还有最近几年兴起的 Protocol Buffer 以及 MessagePack 。 这3个是我们要重点学习和掌握的,其余常见的序列化协议还有:

  • XML:XML(Extensible Markup Language)一种常用的序列化和反序列化协议,历史悠久,从1998年的1.0版本被广泛使用至今。具有跨机器,跨语言等优点;XML序列化和反序列化的开销比较大,如果对于延时性较低的场景不适用。多用于配置文件场景
  • SOAP:SOAP(SIMPLE Object Access Protocol)是一种广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议。IDL是WSDL。在传输层的协议,SOAP最常见的使用方式XML+HTTP
  • Thrift:是Facebook开源提供的一个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量,分布式、跨语言、跨平台数据通讯的需求。但是Thrift并不仅仅是序列化协议,而是一个RPC框架。缺点是安全性低,无法支持向持久层直接读写数据,不适合做数据持久化序列化协议
  • Avro:Avro属于Apache Hadoop的一个子项目。 Avro提供两种序列化格式:JSON格式或者Binary格式。Binary格式在空间开销和解析性能方面可以和Protobuf媲美,Avro的产生解决了JSON的冗长和没有IDL的问题
  • Fastjson:有两种序列化格式:是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致
  • Hessian:采用二进制协议的轻量级remoting onhttp工具
  • kryo:基于protobuf协议,只支持java语言,需要注册(Registration),然后序列化(Output),反序列化(Input)
三、常见的序列化协议性能对比
时间性能对比图解
时间性能对比图解
空间性能对比图解
空间性能对比图解

对比性能数据可大致知道:

  • XML序列化(Xstream)无论在性能和简洁性上比较差
  • Thrift与Protobuf相比在时空开销方面都有一定的劣势
  • Protobuf和Avro在两方面表现都非常优越
四、不同场景下的选型建议

没有最好的,只有最合适的!不同的场景下,不同的序列化协议有着各自的优势:

  • 对于公司间的系统调用,如果性能要求在100ms以上的服务,基于XML的SOAP协议是一个值得考虑的方案
  • 基于Web browser的Ajax,以及Mobile app与服务端之间的通讯,JSON协议是首选。对于性能要求不太高,或者以动态类型语言为主,或者传输数据载荷很小的的运用场景,JSON也是非常不错的选择。
  • 对于调试环境比较恶劣的场景,采用JSON或XML能够极大的提高调试效率,降低系统开发成本
  • 当对性能和简洁性有极高要求的场景,Protobuf,Thrift,Avro之间具有一定的竞争关系
  • 对于T级别的数据的持久化应用场景,Protobuf和Avro是首要选择。如果持久化后的数据存储在Hadoop子项目里,Avro会是更好的选择
  • 由于Avro的设计理念偏向于动态类型语言,对于动态语言为主的应用场景,Avro是更好的选择
  • 对于持久层非Hadoop项目,以静态类型语言为主的应用场景,Protobuf会更符合静态类型语言工程师的开发习惯
  • 如果需要提供一个完整的RPC解决方案,Thrift是一个好的选择
  • 如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf可以优先考虑

已经知道什么是序列化以及如何选择了吧?接下来让我们详细了解一下最常用的三种序列化协议吧。


* 本页内容参考以下数据源:

  • https://baike.baidu.com/item/%E5%BA%8F%E5%88%97%E5%8C%96/2890184
  • https://www.cnblogs.com/ylxn/p/10451805.html
  • https://ask.zkbhj.com/?/article/258
  • https://blog.csdn.net/sanyaoxu_2/article/details/79722431

凯冰科技 · 代码改变世界,技术改变生活
Next Page→