当将数据写入文件、发送到网络、写入到存储时通常须要序列化 (serialization) 技术,从其读取时须要进行反序列化 (deserialization),又称编码(encode) 和解码(decode)。序列化作为传输数据的示意模式,与网络框架和通信协议是解耦的。如 Dubbo 反对 Hessian 和 JSON,HTTP 协定反对 XML、JSON 和流媒体传输等。
序列化的形式有很多,作为数据传输和存储的根底,如何抉择适合的序列化形式显得尤其重要。
序列化分类
通常而言,序列化技术能够大抵分为以下三种类型:
- 内置类型:指编程语言内置反对的类型,如 Java 外面的 java.io.Serializable。这种类型因为与语言绑定,不具备通用性,而且个别性能不佳,个别只在部分范畴内应用。
- 文本类型:个别是标准化的文本格式,如 XML、JSON。这种类型可读性较好,且反对跨平台,具备宽泛的利用。次要毛病是比拟臃肿,网络传输占用带宽大。
- 二进制类型:采纳二进制编码,数据组织更加紧凑,反对多语言和多平台。常见的有 Protocol Buffer/Thrift/MessagePack/FlatBuffer 等。
序列化的性能指标
掂量序列化 / 反序列化次要有三个指标:
- 序列化之后的字节大小
- 序列化 / 反序列化的速度
- CPU 和内存耗费
下图是一些常见的序列化框架性能比照:
能够看出 Protobuf 无论是在序列化速度上还是字节占比上能够说是完爆同行。不过人外有人,天外有天,据说 FlatBuffer 比 Protobuf 更加无敌,下图是来自谷歌的 FlatBuffer 和其余序列化性能比照,光看图中数据 Facebook 貌似秒杀 PB 的存在。
序列化选型考量
在对序列化技术进行选型的时候,咱们须要从以下几个方面思考:
- 性能:CPU 和字节占用大小是序列化的次要开销。在根底的 RPC 通信、存储系统和高并发业务上应该抉择高性能高压缩的二进制序列化。一些外部服务、申请较少 Web 的利用能够采纳文本的 JSON,浏览器间接内置反对 JSON。
- 易用性:丰盛数据结构和辅助工具能进步易用性,缩小业务代码的开发量。当初很多序列化框架都反对列表、哈希等多种构造和可读的打印。
- 通用性:古代的服务往往波及多语言、多平台,是否反对跨平台跨语言的互通是序列化选型的根本条件。
- 兼容性:古代的服务都是疾速迭代和降级,一个好的序列化框架应该有良好的向前兼容性,反对字段的增减和批改等。
- 扩展性:序列化框架是否低门槛的反对自定义的格局有时候也是一个比拟重要的思考因素。
本文亦通过 NoOne’s Blog 发表,更多分享请关注公众号 NoOneNoOne