何为序列化?把对象转换为字节序列的过程称为对象的 序列化 。
何为反序列化?把字节序列恢复为对象的过程称为对象的 反序列化 。
项目中通常使用“对象”来进行数据的操纵,但是当需要对数据进行存储(固化存储、缓存存储)或者传输(跨进程网络传输)时,“对象”就不怎么好用了,往往需要把数据转化成连续空间的二进制字节流。序列化和反序列化主要的应用场景有:
在设计分布式微服务框架时,序列化和反序列化作为框架的一部分,有着举足轻重的地位。比如服务提供者和服务消费者在进行网络通信时,对象需要进行序列化和反序列化,如果序列化框架性能差,就会直接影响整个分布式框架的性能。所以在设计序列化和反序列化框架的时候,我们需要从性能、可扩展性/兼容性、跨语言支持等多个角度进行综合考虑。
影响序列化与反序列化性能的主要因素有:
(1)序列化后码流大小。
(2)序列化/反序列化的速度。
(3)序列化/反序列化系统开销(CPU或者堆内存)。
网络上或者书本上有许多序列化框架性能对比的数据和表格,读者可自行搜索学习,这里不再赘述。通过一些数据对比,我们发现ProtoBuf序列化框架在各个方面都有绝对的优势。
移动互联时代,业务系统需求的更新周期变得更短,新的需求不断涌现,而老的系统还需要继续维护。如果序列化协议具有良好的可扩展性,支持自动增加新的业务字段,而不影响老的服务,那么将大大提高系统的灵活度。一个好的序列化框架应该支持数据结构的向前兼容,比如新增字段、删除字段、调整字段顺序等。
跨语言支持是衡量序列化框架是否通用的一个重要指标,如果序列化框架和某种语言绑定,数据在交换的时候,双方就很难保证一定是采用相同的语言开发的。分布式服务框架在不同的业务、不同的团队可能采用不同的开发语言。不同语言开发的服务要能够互通,序列化和反序列化首先要能够支持互通。