1.概述
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。序列化的目的就是把一种私有的或者某种平台下使用的数据类型转化为标准的可以公开交互的数据信息样式。本文将从数据类型和语法结构支持、性能,易用性和可扩展性几个方面介绍几种常见的序列化方式:JDK Serializable、Protocol buffer、FST、Kryo、Hessian2。
2.数据类型和语法结构支持
JDK Serializable:
|
JDK Serializable | |
|
8种基础类型 |
支持 |
|
List集合类 |
支持 |
|
Set集合类 |
支持 |
|
Queue集合类 |
支持 |
|
Map |
大部分支持(WeakHashap不支持) |
|
自定义类型 |
支持 |
|
枚举类型 |
支持 |
|
对象为null |
支持 |
|
没有无参构造函数 |
支持 |
|
static内部类 |
支持(static内部类需实现Serializable接口) |
|
非static内部类 |
支持,外部类也需实现Serializable接口 |
|
局部内部类 |
支持 |
|
匿名内部类 |
支持 |
|
Lambda表达式 |
需修改代码 |
|
闭包 |
支持 |
|
异常类 |
支持 |
Protocol buffer:
|
Protocol buffer | |
|
8种基础类型 |
大部分支持(除byte、short、char) |
|
List集合类 |
支持 |
|
Set集合类 |
支持 |
|
Queue集合类 |
支持 |
|
Map |
支持 |
|
自定义类型 |
支持 |
|
枚举类型 |
支持 |
FST:
|
FST | |
|
8种基础类型 |
支持 |
|
List集合类 |
支持 |
|
Set集合类 |
支持 |
|
Queue集合类 |
支持 |
|
Map |
大部分支持(WeakHashap不支持) |
|
自定义类型 |
支持 |
|
枚举类型 |
支持 |
|
对象为null |
支持 |
|
没有无参构造函数 |
支持 |
|
static内部类 |
支持(static内部类需实现Serializable接口) |
|
非static内部类 |
支持,外部类也需实现Serializable接口 |
|
局部内部类 |
支持 |
|
匿名内部类 |
支持 |
|
Lambda表达式 |
需修改代码(同JDK Serializable) |
|
闭包 |
支持 |
|
异常类 |
支持 |
Kryo:
|
Kryo | |
|
8种基础类型 |
支持 |
|
List集合类 |
支持 |
|
Set集合类 |
支持 |
|
Queue集合类 |
部分支持(ArrayBlockingQueue不支持) |
|
Map |
支持 |
|
自定义类型 |
支持 |
|
枚举类型 |
支持 |
|
对象为null |
支持 |
|
没有无参构造函数 |
不支持 |
|
static内部类 |
支持 |
|
非static内部类 |
不支持 |
|
局部内部类 |
支持 |
|
匿名内部类 |
支持 |
|
Lambda表达式 |
不支持 |
|
闭包 |
支持 |
|
异常类 |
不支持(StackOverflowError) |
Hessian2:
|
Hessian2 | |
|
8种基础类型 |
支持 |
|
List集合类 |
支持 |
|
Set集合类 |
支持 |
|
Queue集合类 |
部分支持(SynchronousQueue不支持) |
|
Map |
支持 |
|
自定义类型 |
支持 |
|
枚举类型 |
支持 |
3.性能测试
注:为了方便测试将原文件解析后拆分序列化为多个文件,所以总文件大小大于原文件(测试文件大小2G)
时间单位(毫秒)
|
JDK Serializable |
Protocol buffer |
FST |
Kryo |
Hessian2 | |
|
序列化时间 |
440272 |
90612 |
87538 |
29846 |
422879 |
|
反序列化时间 |
1193040 |
64159 |
56835 |
49106 |
154819 |
|
文件大小 |
4.48G |
3.78G |
4.06G |
3.54G |
3.84G |
4.易用性
JDK Serializable:使用简单,无需引用外部依赖
Protocol buffer:使用复杂,需要使用IDL来定义Schema描述文件,定义完描述文件后,使用protoc生成序列化和反序列化代码
FST:导入后可直接使用,FSTConfiguration提供了序列化与反序列化的方法

Kryo:可直接使用,但直接序列化KUFL后,反序列化KUFL时有问题,需要修改代码,封装了大部分流的操作,可自定义序列化器,设置默认序列化器,不支持非static内部类 ,不支持没有无参构造函数

Hessian2:可直接使用,跨语言不需要使用IDL

5.可扩展性
JDK Serializable:只适用于Java,自定义serialVersionUID,保证序列化前后VUID一致即可
Protocol buffer:可跨语言(需使用IDL定义描述文件),支持字段扩展,只要保证新增id标识没有使用过即可
FST:只适用于Java,通过@Version控制版本,新增字段需要修改Version版本
Kryo:主要适用于Java(跨语言复杂),默认序列化器不支持字段扩展,需要修改默认序列化器或自己实现序列化器
Hessian2:可跨语言(无需使用IDL),支持字段扩展

被折叠的 条评论
为什么被折叠?



