序列化
大约 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对象