了解哪几种序列化协议?
🦅 概念
- 序列化(编码),是将对象序列化为二进制形式(字节数组),主要用于网络传输、数据持久化等。
- 反序列化(解码),则是将从网络、磁盘等读取的字节数组还原成原始对象,主要用于网络传输对象的解码,以便完成远程调用。
🦅 选型
在选择序列化协议的选择,主要考虑以下三个因素:
- 序列化后的字节大小。更少的字节数,可以减少网络带宽、磁盘的占用。
- 序列化的性能。对 CPU、内存资源占用情况。
- 是否支持跨语言。例如,异构系统的对接和开发语言切换。
🦅 方案
如果对序列化工具了解不多的胖友,可能一看有这么多优缺点会比较懵逼,可以先记得有哪些序列化工具,然后在慢慢熟悉它们的优缺点。
重点,还是知道【选型】的考虑点。
- 【重点】Java 默认提供的序列化
- 无法跨语言;序列化后的字节大小太大;序列化的性能差。
- 【重点】XML 。
- 优点:人机可读性好,可指定元素或特性的名称。
- 缺点:序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息;只能序列化公共属性和字段;不能序列化方法;文件庞大,文件格式复杂,传输占带宽。
- 适用场景:当做配置文件存储数据,实时数据转换。
- 【重点】JSON ,是一种轻量级的数据交换格式。
- 优点:兼容性高、数据格式比较简单,易于读写、序列化后数据较小,可扩展性好,兼容性好。与 XML 相比,其协议比较简单,解析速度比较快。
- 缺点:数据的描述性比 XML 差、不适合性能要求为 ms 级别的情况、额外空间开销比较大。
- 适用场景(可替代 XML ):跨防火墙访问、可调式性要求高、基于Restful API 请求、传输数据量相对小,实时性要求相对低(例如秒级别)的服务。
- 【了解】Thrift ,不仅是序列化协议,还是一个 RPC 框架。
- 优点:序列化后的体积小, 速度快、支持多种语言和丰富的数据类型、对于数据字段的增删具有较强的兼容性、支持二进制压缩编码。
- 缺点:使用者较少、跨防火墙访问时,不安全、不具有可读性,调试代码时相对困难、不能与其他传输层协议共同使用(例如 HTTP)、无法支持向持久层直接读写数据,即不适合做数据持久化序列化协议。
- 适用场景:分布式系统的 RPC 解决方案。
- 【了解】Avro ,Hadoop 的一个子项目,解决了JSON的冗长和没有IDL的问题。
- 优点:支持丰富的数据类型、简单的动态语言结合功能、具有自我描述属性、提高了数据解析速度、快速可压缩的二进制数据形式、可以实现远程过程调用 RPC、支持跨编程语言实现。
- 缺点:对于习惯于静态类型语言的用户不直观。
- 适用场景:在 Hadoop 中做 Hive、Pig 和 MapReduce 的持久化数据格式。
- 【重点】 ,将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象和 Protobuf 相关的方法和属性。 Protobuf
- 优点:序列化后,、结构化数据存储格式(XML JSON等)、通过标识字段的顺序,可以实现协议的前向兼容、结构化的文档更容易管理和维护。 码流小 性能高
- 缺点:需要依赖于工具生成代码、支持的语言相对较少,官方只支持Java 、C++、python。
- 适用场景:对性能要求高的 RPC 调用、具有良好的跨防火墙的访问属性、适合应用层对象的持久化。
- 其它
- 【重点】Protostuff ,基于 Protobuf 协议,但不需要配置proto 文件,直接导包即可。
- 目前,微博 RPC 框架 Motan 在使用它。
- 【了解】Jboss Marshaling ,可以直接序列化 Java 类, 无须实现 java.io.Serializable 接口。
- 【了解】Message Pack ,一个高效的二进制序列化格式。
- 【重点】Hessian ,采用二进制协议的轻量级 服务。 remoting on http
- 目前,阿里 RPC 框架 Dubbo 的默认序列化协议。
- 【重要】kryo ,是一个快速高效的Java对象图形序列化框架,主要特点是性能、高效和易用。该项目用来序列化对象到文件、数据库或者网络。
- 目前,阿里 RPC 框架 Dubbo 的可选序列化协议。
- 【重要】FST ,fast-serialization 是重新实现的 Java 快速对象序列化的开发包。序列化速度更快(2-10倍)、体积更小,而且兼容 JDK 原生的序列化。要求 JDK 1.7 支持。
- 目前,阿里 RPC 框架 Dubbo 的可选序列化协议。
- 【重点】Protostuff ,基于 Protobuf 协议,但不需要配置proto 文件,直接导包即可。
本文由作者按照 CC BY 4.0 进行授权