跳至主要內容

序列化

摸鱼散人大约 3 分钟

什么是序列化?什么是反序列化?

  • 序列化
    • 把Java对象转为二进制流,方便存储和传输
  • 反序列化
    • 把二进制流恢复成对象
  • Serializable接口有什么用?
    • 用于标识类可以被序列化
    • 实现Serializable接口的类可以将对象转换为字节流进行传输和存储,实现数据的持久化和
      跨平台的数据交换
  • serialVersionUID 又有什么用
    • 版本控制
      • 当一个类被序列化后,如果后续对该类进行了修改,例如添加、删除或修改了类的属性、方法等,那么序列化和反序列化时可能会出现版本不一致的问题。为了避免这种问题,可以在类中显式地定义serialVersionUID字段,并确保在类的修改后,serialVersionUID的值保持不变。当反序列化时,会比较序列化类的版本号和当前类的版本号是否一致,如果不一致,则会抛出InvalidClassException异常
    • 兼容性
      • 当一个类的实例被序列化后,如果在后续的版本中对该类进行了修改,但是仍然希望能够反序列化之前的序列化数据,那么可以通过显式地指定serialVersionUID来保持兼容性。如果新版本的类和旧版本的类具有相同的serialVersionUID,那么即使类的结构发生了变化,仍然可以成功反序列化之前的序列化数据
  • Java 序列化不包含静态变量
    • Java序列化只会保存对象的非静态成员变量,不包含静态变量
    • 静态变量属于类的状态信息,在序列化时不需要保存
  • 如果有些变量不想序列化,怎么办?
    • 使用 transient 关键字修饰
    • transient 关键字的作用
      • 阻止实例中那些用此关键字修饰的的变量序列化
      • 当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复
    • transient 只能修饰变量,不能修饰类和方法

说说有哪些常见的序列化方式?

  • Java对象流序列化
    • Java对象流序列化是Java标准库提供的一种序列化方式
    • 通过实现Serializable接口和Externalizable接口来实现对象的序列化和反序列化
    • Java序列化可以将对象序列化为字节流,也可以将对象序列化为JSON、XML等格式
  • JSON序列化
    • 是一种轻量级的数据交换格式,常用于Web应用中
    • Java中可以使用第三方库,如Jackson、Gson等,将对象序列化为JSON格式,也可以将JSON格式的数据反序列化为Java对象
  • XML序列化
    • XML(Extensible Markup Language)是一种标记语言,常用于Web应用中
    • Java中可以使用第三方库,如JAXB、XStream等,将对象序列化为XML格式,也可以将XML格式的数据反序列化为Java对象
  • Protobuf序列化
    • Protobuf(Protocol Buffers)是Google开发的一种高效的序列化协议
    • 可以将结构化的数据序列化为紧凑的二进制格式
    • Java中可以使用Google提供的protobuf-java库,将对象序列化为Protobuf格式,也可以将Protobuf格式的数据反序列化为Java对象
  • Hessian序列化
    • Hessian是一种基于HTTP的轻量级二进制序列化协议
    • 可以将Java对象序列化为二进制格式,并通过HTTP协议进行传输
    • Java中可以使用第三方库,如Hessian、Dubbo等,将对象序列化为Hessian格式,也可以将Hessian格式
      的数据反序列化为Java对象