前言
在之前的文章中,有针对JDK序列化方式的描述以及代码示例
由于其序列化后的数据较大,且序列化的性能不高,于是市面上出现了很多既可以缩小序列化后数据大小并且又能提高序列化性能的序列化框架,例如Google出品的Protobuf以及Kryo等
序列化框架性能
以下两张图是引用网上关于几款序列化框架的性能及大小测试的对比图
时间占用对比图:
空间占用对比图:
由此可见,JDK原生的序列化方式耗时最长,并且占用空间最大。在对比之下,各方面表现较好的是Google的Protobuf,Protobuf需要通过静态编译.proto文件来获得Java文件,使用起来不是特别方便,但是后来新出现的Protostuff弥补了这个不足,支持在Java程序中使用Schema动态配置POJO的映射关系。关于Protobuf的学习我会放在后面,这里是对Java语言实现的Kryo进行学习,毕竟它的表现与Protobuf旗鼓相当。
Kryo序列化
Kryo是一个快速高效的Java序列化框架,旨在提供快速、高效和易用的Api
我打算自己实现一个RPC框架,目前想的是就是用Kryo是用序列化框架,因为觉得首先,这个序列化框架是使用Java语言写的,性能也和不错,并且使用起来相对方便
1.首先需要再项目中引入对应的pom依赖:
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>4.0.1</version>
</dependency>
2.定义需要序列化的类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class KryoTest {
private Long id;
private String name;
private List<String> list;
}
3.进行序列化处理
Kryo kryo = new Kryo();
kryo.register(KryoTest.class);
List<String> list = new ArrayList<>(2);
list.add("aa");
list.add("bb");
Output output = new Output(new FileOutputStream("output.txt"));
KryoTest kryoTest = new KryoTest(1L, "Test", list);
kryo.writeObject(output, kryoTest);
output.close();
4.进行反序列化处理
Kryo kryo = new Kryo();
kryo.register(KryoTest.class);
Input input = new Input(new FileInputStream("output.txt"));
KryoTest kryoTest1 = kryo.readObject(input, KryoTest.class);
input.close();
System.out.println(kryoTest1.toString());
5.输出结果
KryoTest(id=1, name=Test, list=[aa, bb])
总结
通过上面简单例子熟悉了Kryo序列化的简单使用,当时要是想要用在生产过程中还有有一些需要注意的问题的
比如像上面性能对比两张图展示的那样,Kryo要是想发挥出色的性能还是需要做一些配置的,可以通过类注册+关闭循环引用的方式,提高序列化的性能
此外,Kryo序列化不是线程安全的,在使用过程中还需要注意线程安全问题,此部分内容,我在后续实现RPC框架的过程中会进行学习和总结