常见序列化方式

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),支持字段扩展

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值