在设计或重构系统的过程中,特别是在设计分布式、大数据量系统里面,序列化选型是一个重要环节,因为序列化协议影响系统的通用性、健壮性、安全性,是否易于调试、是否便于扩展。
序列化分理论和实践部分,理论部分描述只序列化是什么、要做什么,不关心实现(因为不考虑具体实现,所以自然不会考虑优缺点、应用场景);实践部分描述如何完成序列化操作,对象用什么方法表示,即把序列化从理论世界带进现实世界。序列化理论部分相当于是设计,实践部分相当于实现。
理论
序列化理论包含的三个方面
-
序列化定义;
-
序列化在通信协议中的地位;
-
序列化组件
1. 序列化问题是怎么产生的(序列化的定义)
互联网的发展产生了机器之间互相通讯的需求,机器之间互相通讯需要约定通讯协议,通信协议又要考虑数据如何表示、如何传输等问题。序列化就是通信协议里与数据的表示相关的那一部分协议。OSI七层协议模型中的展现层(Presentation Layer)的主要功能是把对象转换成一段连续的二进制串,或把二进制串转换成对象–这就是序列化和反序列化。
所以,序列化和反序列化的定义就是:
-
序列化: 将数据结构或对象转换成二进制串
-
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或对象
注:不一定非要转换成二进制,只要是能传输到通信另一端都可以,例如utf-8字符串。
2. 序列化在通信协议中的地位
-
OSI七层协议模型,序列化位于展示层(Presentation Layer)
-
在TCP/IP协议中,序列化位于应用层。
3. 序列化和反序列化的组件
完整的序列化协议包含以下组件:
-
IDL文件(Interface description language)。参与通讯的各方需要对通讯的内容做相关约定。为了与语言和平台无关,这个约定需要采用与编程语言、平台无关的语言来进行描述。这种语言被称为接口描述语言(IDL),采用IDL撰写的协议约定称为IDL文件。
-
IDL Compiler:IDL文件中的约定需要一个编译器,将IDL文件转换成各编程语言的动态库。
-
Stub/Skeleton Lib:负责序列化和反序列化工作的代码。Stub是一段部署在客户端的代码,一方面接收应用层的参数,并对其序列化后通过底层协议栈发送到服务端;另一方面接收服务端序列化后的结果数据,反序列化后交给应用层;Skeleton部署在服务端,其功能与Stub相反,从传输层接收序列化参数,反序列化后交给服务端应用层,并将应用层的执行结果序列化后最终传送给客户端。
序列化组件之间的交互关系:
序列化组件之间的交互
序列化组件的概念与数据库的相关概念类似: