数据序列化的那些事

数据序列化的那些事 戳蓝字「TopCoder」关注我们哦!

数据序列化的那些事

编者注:关于数据序列化,首先要了解为什么需要序列化以及数据序列化的意义是什么,然后再了解下当前较为广泛的几种序列化方式。

为什么需要数据序列化呢?因为数据要“传输”,比如将数据网络通信传递给其他服务器,或者持久化到磁盘。那么传输为什么需要序列化呢?因为在内存中的数据,当前进程是知道数据格式和内容的,但是数据传输是二进制(或文本格式),所以需要有一个内存数据格式转换为二进制(或文本格式)的过程。数据序列化,可以进行数据压缩、数据格式多语言兼容等。下面就按照序列化的技术演变过程一起看下序列化的发展之路。

文本格式序列化

直接将数据转变为文本格式,也就是字符串形式的文本保存,如果一个数据存在多个字段可使用固定分隔符(比如",")分隔,该方案存储简单但是针对复杂对象比如嵌套数据,存储起来较为麻烦,并且无法表示本来就是二进制格式的数据,比如图片、视频等。

语言内置序列化

目前编程语言基本都内置了至少一种数据序列化机制,比如Java的 Serialization、Python的pickle等,语言内置的序列化机制大都和该语言绑定,也就是说反序列化也必须是该语言才行,因此很难做到跨语言的读取写入。

跨语言序列化

语言内置的序列化大都和语言绑定,因此有了应用范围广泛、跨语言的数据序列化格式,例如json、xml等,但是这些跨语言序列化方案存在的最大劣势就是有性能问题,并且无数据类型信息,同时数据序列化冗余较大,比如json会保存每个属性名字。除了json和xml这种跨语言序列化之外,还有类似于hession这种跨语言序列化(这是序列化框架本身支持跨语言,目前只会Python/Java/C++等)的机制,序列化数据是二进制格式,并且包含数据类型信息。

带schema描述序列化

带有schema描述的数据表示格式,通过统一化的schema描述,可约束每个字段的类型,进而为存储和解析数据带来优化的可能。此外,统一schema的引入,可减少属性名称重复存储带来的开销,同时,也有利于数据共享。带有schema描述的序列化常用的有Thrift、Protocol Buffers和Avro,它们一般被称为Language Of Data,使得跨语言序列化成为可能,并且它们提供了代码生成工具,方便为开发者生成各个语言的代码。Language Of Data具有特性如下:

  • 提供IDL(Interface Description language)用以描述数据schema,用来定义结构化或者非结构化数据;

  • 跨语言支持,至少支持Java、Python和C/C++

  • 数据编码压缩,比如字符串压缩和整数变长编码等;

  • 数据序列化兼容,保证序列化的向后兼容性,比如旧schema序列化的数据可由新schema反序列化,新schema序列化也可以由旧schema解析等。

关于protobuf为什么这么快可以参考文档:https://www.jianshu.com/p/72108f0aefca。

 推荐阅读 


欢迎小伙伴关注【TopCoder】阅读更多精彩好文。

数据序列化的那些事