java序列化

序列化与反序列化

  1. 序列化

    • 把对象转换成字节序列, 方便存储或传输.
  2. 反序列化

    • 把字节序列恢复成对象.

序列化的作用

  1. 持久化: 把对象保存到磁盘、数据库、网络中, 方便后续使用.

  2. 网络传输: 把对象发送到另一台计算机, 进行远程调用.

  3. 多线程: 在多线程环境下, 可以把对象在内存中进行传输, 避免数据同步问题.

java序列化库

  1. gson(google 出品, 功能强大, 性能高, 但不支持 java 原生序列化)

  2. fastjson (阿里巴巴出品, 功能简单, 性能高, 支持 java 原生序列化, 但漏洞很多)

  3. jackson(fasterxml 出品, 功能强大, 性能较高, 支持 java 原生序列化)

  4. kryo(google 出品, 功能强大, 性能较高, 支持 java 原生序列化)

序列化的步骤

  1. 定义一个类, 实现 Serializable 接口.

  2. 调用 ObjectOutputStream 类的 writeObject() 方法, 把对象序列化到输出流中.

  3. 调用 ObjectInputStream 类的 readObject() 方法, 把对象从输入流中反序列化出来.

性能问题

  • 建议尽量减少序列化和反序列化的对象, 只序列化必要的属性, 尽量不要序列化大对象.
  • 建议使用高性能的序列化库, 如 gson、jackson、kryo.
  • 建议使用压缩算法压缩序列化后的字节序列, 如 gzip、deflate.

总结

  • 序列化: 把对象转换成字节序列, 方便存储或传输.
  • 反序列化: 把字节序列恢复成对象.
  • 序列化的作用: 持久化、网络传输、多线程.
  • 序列化的步骤: 定义类、调用 writeObject() 方法、序列化到输出流.
  • 序列化的注意事项: 实现 Serializable 接口、有默认构造函数、不包含 transient 变量、不包含静态变量、不包含循环引用、不包含 native 方法、不包含枚举、不包含内部类、不包含数组、不包含集合类、不包含 Map.Entry、不包含自定义序列化方法、不包含父类、不包含内部类、不包含 Unsafe 类、不包含克隆方法、不包含序列化回调.
  • 序列化的性能问题: 尽量减少序列化的对象、使用高性能的序列化库、使用压缩算法压缩序列化后的字节序列.
  • 反序列化的步骤: 调用 readObject() 方法、反序列化从输入流中、恢复成对象.
  • 反序列化的注意事项: 实现 Serializable 接口、有默认构造函数、不包含 transient 变量、不包含静态变量、不包含循环引用、不包含 native 方法、不包含枚举、不包含内部类、不包含数组、不包含集合类、不包含 Map.Entry、不包含自定义序列化方法、不包含父类、不包含内部类、不包含 Unsafe 类、不包含克隆方法、不包含序列化回调.
  • 反序列化的性能问题: 尽量减少反序列化的对象、使用高性能的序列化库、使用压缩算法解压缩序列化后的字节序列.
使用 Hugo 构建
主题 StackJimmy 设计