Published on

序列化之选型指南:选择适合你的序列化方式

Authors
  • avatar
    Name
    NoOne
    Twitter

当需要将数据写入文件、发送到网络或写入存储时,通常需要使用序列化技术。序列化将数据转换为特定的表示形式,以便在读取时进行反序列化。这个过程也被称为编码和解码。序列化作为传输数据的表示形式与网络框架和通信协议解耦,因此选择适合的序列化方式显得尤为重要。

序列化可以分为以下三种类型:

  1. 内置类型:这些是编程语言内置支持的类型,例如Java中的java.io.Serializable。由于与特定语言绑定,这些类型缺乏通用性,并且性能通常较差,因此一般只在局部范围内使用。

  2. 文本类型:这些类型通常是标准化的文本格式,例如XML和JSON。文本类型具有良好的可读性,支持跨平台应用,应用广泛。主要缺点是数据比较冗长,占用网络带宽较大。

  3. 二进制类型:这些类型使用二进制编码,数据组织更加紧凑,支持多语言和多平台。常见的二进制类型包括Protocol Buffer、Thrift、MessagePack和FlatBuffer等。

对序列化性能的衡量主要有以下三个指标:

  1. 序列化后的字节大小:衡量序列化后数据占用的存储空间。

  2. 序列化/反序列化速度:衡量序列化和反序列化操作的执行速度。

  3. CPU和内存消耗:衡量序列化和反序列化过程中所需的计算资源和内存开销。

下图展示了一些常见序列化框架的性能对比:

序列化和反序列化速度对比
序列化字节占用对比

从图中可以看出,Protobuf在序列化速度和字节占用方面表现出色,超过了其他框架。然而,每个框架都有其优势和适用场景。另外,据说FlatBuffer比Protobuf更强大,下图展示了谷歌的FlatBuffer与其他序列化框架的性能对比,从数据上看,Facebook的FlatBuffer似乎超越了Protobuf的存在。

FlatBuffer性能对比

在选择序列化技术时,需要考虑以下几个方面:

  1. 性能:CPU和字节占用是序列化的主要开销。在基础的RPC通信、存储系统和高并发业务中,应选择高性能和高压缩率的二进制序列化技术。而一些内部服务或请求较少的Web应用可以选择文本格式的JSON,因为浏览器已经内置了对JSON的支持。

  2. 易用性:序列化框架应提供丰富的数据结构和辅助工具,以提高易用性并减少业务代码的开发量。现代序列化框架通常支持列表、哈希等多种数据结构,并提供可读性较好的打印输出。

  3. 通用性:现代服务往往涉及多语言和多平台,因此选择的序列化技术应支持跨平台和跨语言的互通。

  4. 兼容性:优秀的序列化框架应具备良好的向前兼容性,能够支持字段的增减和修改等变更,以适应快速迭代和升级的需求。

  5. 扩展性:在某些情况下,序列化框架能够支持自定义格式是一个重要的考虑因素。

综上所述,选择合适的序列化方式需要综合考虑性能、易用性、通用性、兼容性和扩展性等因素。

Share this content