1 什么是序列化?什么是反序列化?
- 序列化 是 将数据结构或对象转换成二进制字节流的过程
- 反序列化是将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程
2 实际开发中有哪些用到序列化和反序列化的场景?
-
将对象存储到文件中的时候需要进行序列化,将对象从文件中读取出来需要进行反序列化。
-
对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
-
将对象存储到缓存数据库(如 Redis)时需要用到序列化,将对象从缓存数据库中读取出来需要反序列化。
3 常见序列化协议对比
3.1 DK 自带的序列化方式
JDK 自带的序列化,只需实现 java.io.Serializable接口即可。
public class TestBean implements Serializable {
private static final long serialVersionUID = 1905122041950251207L;
private String userName;
private String password;
}
3.2 Kryo
Kryo 是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度和较小的字节码体积。
另外,Kryo 已经是一种非常成熟的序列化实现了,已经在 Twitter、Groupon、Yahoo 以及多个著名开源项目(如 Hive、Storm)中广泛的使用。
3.3 Protobuf
Protobuf 出自于 Google,性能还比较优秀,也支持多种语言,同时还是跨平台的。就是在使用中过于繁琐,因为你需要自己定义 IDL 文件和生成对应的序列化代码。这样虽然不灵活,但是,另一方面导致 protobuf 没有序列化漏洞的风险。