序列化与反序列化
-
序列化
- 把对象转换成字节序列, 方便存储或传输.
-
反序列化
- 把字节序列恢复成对象.
序列化的作用
-
持久化: 把对象保存到磁盘、数据库、网络中, 方便后续使用.
-
网络传输: 把对象发送到另一台计算机, 进行远程调用.
-
多线程: 在多线程环境下, 可以把对象在内存中进行传输, 避免数据同步问题.
java序列化库
-
gson(google 出品, 功能强大, 性能高, 但不支持 java 原生序列化)
-
fastjson (阿里巴巴出品, 功能简单, 性能高, 支持 java 原生序列化, 但漏洞很多)
-
jackson(fasterxml 出品, 功能强大, 性能较高, 支持 java 原生序列化)
-
kryo(google 出品, 功能强大, 性能较高, 支持 java 原生序列化)
序列化的步骤
-
定义一个类, 实现 Serializable 接口.
-
调用 ObjectOutputStream 类的 writeObject() 方法, 把对象序列化到输出流中.
-
调用 ObjectInputStream 类的 readObject() 方法, 把对象从输入流中反序列化出来.
性能问题
- 建议尽量减少序列化和反序列化的对象, 只序列化必要的属性, 尽量不要序列化大对象.
- 建议使用高性能的序列化库, 如 gson、jackson、kryo.
- 建议使用压缩算法压缩序列化后的字节序列, 如 gzip、deflate.
总结
- 序列化: 把对象转换成字节序列, 方便存储或传输.
- 反序列化: 把字节序列恢复成对象.
- 序列化的作用: 持久化、网络传输、多线程.
- 序列化的步骤: 定义类、调用 writeObject() 方法、序列化到输出流.
- 序列化的注意事项: 实现 Serializable 接口、有默认构造函数、不包含 transient 变量、不包含静态变量、不包含循环引用、不包含 native 方法、不包含枚举、不包含内部类、不包含数组、不包含集合类、不包含 Map.Entry、不包含自定义序列化方法、不包含父类、不包含内部类、不包含 Unsafe 类、不包含克隆方法、不包含序列化回调.
- 序列化的性能问题: 尽量减少序列化的对象、使用高性能的序列化库、使用压缩算法压缩序列化后的字节序列.
- 反序列化的步骤: 调用 readObject() 方法、反序列化从输入流中、恢复成对象.
- 反序列化的注意事项: 实现 Serializable 接口、有默认构造函数、不包含 transient 变量、不包含静态变量、不包含循环引用、不包含 native 方法、不包含枚举、不包含内部类、不包含数组、不包含集合类、不包含 Map.Entry、不包含自定义序列化方法、不包含父类、不包含内部类、不包含 Unsafe 类、不包含克隆方法、不包含序列化回调.
- 反序列化的性能问题: 尽量减少反序列化的对象、使用高性能的序列化库、使用压缩算法解压缩序列化后的字节序列.