最近看了美团点评技术团队发表的序列化与反序列化文章,感觉写得很到位,满满的都是干货,为他们点个赞!因此也自己顺便总结了一下,以便加深理解。
What:
序列化与反序列化是出于持久化存储以及网络通信发展的需求而产生的,在互联网企业中,序列化与反序列化主要用于网络通信。
序列化:将程序中的对象或者数据结构转换成二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成对象或者数据结构的过程。
序列化与反序列化对应于ISO-OSI七层参考模型的表示层,对应到TCP/IP协议栈则是应用层。
Feaures:
仅仅列举比较关注的,比如:
通用性: 技术上的是否跨平台、跨语言,流行度上的流行程度、社区支持程度;
可读性/可调试性:特别是跨系统的调试,可调试性尤为重要,当然,可读性很大程度上决定了是否方便调试;
性能:主要涉及序列化与反序列化时解析的时间开销,内存与硬盘的空间开销。
Components:
IDL: Interface Description Language,参与通信的各方需要对通信的内容进行相关的约定,因此需要建立一种跨平台、跨语言的描述,即接口描述语言;
IDL compiler: 将IDL文件转换成各自语言对应库的编译器;
Stub/Skeleton; Stub部署在客户端,Skeleton部署在服务端,负责序列化与反序列化的工作;
Client/Server: 应用层的业务代码,跟Stub/Skeleton打交道。
这个组件关系图,可以将后面的主流的协议都套用进来,因此是我理解序列化与反序列化操作过程的核心。
Major Protocols:
1、XML & SOAP
XML是数据交换格式的国际标准,也是一种常用的序列化与反序列化协议。
XML的优点是可读性好,跨平台、跨语言,而且具有自我描述的能力。
SOAP协议(Simple Object Access Protocol)是一种广泛应用的,基于XML进行序列化与反序列化的结构化消息传递协议。SOAP支持多种传输层协议,但是最常用的还是XML + HTTP协议。
2、Json & REST
Json(JavaScript Object Notation),起源于弱类型语言JavaScript,其本质是采用"Attribute-Value"的方式来描述对象。
Json保持了XML的高可读性,相对于XML具有解析速度快,序列化数据更小的优点,由于JavaScript的先天性支持,被广泛应用于Web开发中,是Ajax的事实上的标准协议。
REST是一种软件架构风格,通过URL来设计系统的结构。在REST风格的Web服务中,每个资源都有一个地址,资源本身都是方法调用的目标,方法都是HTTP标准方法。
3、Apache Thrift
Thrift是为了满足当前大数据量、分布式、跨平台、跨语言的通信需求而产生的高性能、轻量级RPC框架。相对于XML和Json而言,时间开销和空间开销低很多,但是由于序列化后为Binary数组,不具有可读性。
4、Protobuf
Protobuf是G家推出的工具,其目标就是为了实现一个跨平台、跨语言、时间效率和空间效率都非常高的表示层协议。Protobuf的时间和空间开销都很小,有标准的IDL和IDL编译器,使用友好,可以与传输层的多种协议一起使用,缺点是可读性差。
5、Avro
Avro是Apache Hadoop的子项目,跟Hadoop圈的项目结合使用是优势。由于提供了两种序列化格式:Json格式和Binary格式,因而兼有方便调试以及高效的优点。
Personal Summary
总的来说,序列化与反序列化协议,是朝着跨平台、跨语言 ---> 高可读性和可操作性 ---> 领域内时间、空间都高效的方向发展,当我们感觉不到它们存在的时候,或许就是已经很满足需求的时候。