写在前面

本文隶属于专栏《100个问题搞定大数据理论体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定大数据理论体系

解答

当需要将数据存入文件或者通过网络发送出去时,需将数据对象转化为字节流,即对数据序列化。
1. 数据序列化本质上是将JVM中链式存储的对象转化成连续存储的字节数组,这将极大的减少数据大小。
2. 对于每一个序列化的Java对象来说都有唯一的序列化 UID,这样可以保证在新的 JVM 中恢复对象即反序列化后同一个对象只会存在一份,这减少了内存的占用,同时也解决了对象之间依赖的问题。

补充

序列化技术是如何发展的?

考虑到性能、占用空间以及兼容性等因素,我们通常会经历以下几个阶段的技术演化,最终找到解决该问题的最优方案:

阶段1——字符串

不考虑任何复杂的序列化方案,直接将数据转化成字符串,以文本形式保存或传输,如果一条数据存在多个字段,则使用分隔符(比如“,”)分割。

该方案存储简单数据绰绰有余,但对于复杂数据,且数据模式经常变动时,将变得非常烦琐,通常会面临以下问题。

  1. 难以表达嵌套数据:如果每条数据是嵌套式的,比如存在类似于map,list数据结构时,以文本方式存储是非常困难的。
  2. 无法表达二进制数据:图片、视频等二进制数据无法表达,因为这类数据无法表示成简单的文本字符串。
  3. 难以应对数据模式变化:在实际应用过程中,由于用户考虑不周全或需求发生变化, 数据模式可能会经常发生变化。而每次发生变化,之前所有写入和读出(解析)模块均不可用,所有解析程序均需要修改,非常烦琐。

阶段2——编程语言内置序列化机制

采用编程语言内置的序列化机制,比如 Java Serialization, Python pickle等。

这种方式解决了阶段1面临的大部分问题,但随着使用逐步深入,我们发现这种方式将数据表示方式跟某种特定语言绑定在一起,很难做到跨语言数据的写入和读取。

阶段3——JSON/XML

为了解决阶段2面临的问题,我们决定使用应用范围广、跨语言的数据表示格式,比如JSON和XML。

但使用一段时间后,你会发现这种方式存在严重的性能问题:解析速度太慢,同时数据存储冗余较大,比如JSON会重复存储每个属性的名称等。

阶段4——统一schema

阶段4:到这一阶段,我们期望出现一种带有 schema描述的数据表示格式,通过统一化的 schema描述,可约束每个字段的类型,进而为存储和解析数据带来优化的可能。

此外,统一schema的引入,可减少属性名称重复存储带来的开销,同时,也有利于数据共享。

分布式系统中序列化框架该如何选择?

请参考我的另一篇博客——分布式系统中序列化框架该如何选择?

Q.E.D.


Apache Spark Contributor