数据序列化那些事
关于数据序列化,首先要了解为什么需要序列化以及数据序列化的意义是什么,然后再了解下当前较为广泛的几种序列化方式。
为什么需要数据序列化呢?因为数据要“传输”,比如将数据网络通信传递给其他服务器,或者持久化到磁盘。那么传输为什么需要序列化呢?因此在内存中的数据,当前进程是知道数据格式和内容的,但是数据传输是二进制(或文本格式),所以需要有一个内存数据格式转换为二进制(或文本格式)的过程。数据序列化,可以进行数据压缩、数据格式多语言兼容等。下面就按照序列化的技术演变过程一起看下序列化的发展之路。
文本格式序列化
直接将数据转变为文本格式,也就是字符串形式的文本保存,如果一个数据存在多个字段可使用固定分隔符(比如”,”)分隔,该方案存储简单但是针对复杂对象比如嵌套数据,存储起来较为麻烦,并且无法表示本来就是二进制格式的数据,比如图片、视频等。
语言内置序列化
目前编程语言基本都内置了至少一种数据序列化机制,比如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
- 本文链接:http://luoxn28.github.io/2020/04/06/shu-ju-xu-lie-hua-na-xie-shi/
- 版权声明:本文章著作权归作者所有,任何形式的转载都请注明出处。
分享