序列化

本文最后更新于 2025年5月20日 14:24

序列化和反序列化

  • 序列化:将数据结构或对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是 JSON, XML 等文本格式
  • 反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程

常用场景

  • 网络传输:对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
  • 持久化:将对象存储到文件、数据库或内存之前需要进行序列化,将对象从文件、数据库或内存中读取出来需要进行反序列化;

常见序列化协议

JDK 自带序列化因为效率低和不安全所以不经常用,常用的有Hessian、Kryo、Protobuf、ProtoStuff,这些都是基于二进制的序列化协议。

JSON 和 XML 这种属于文本类序列化方式。虽然可读性比较好,但是性能较差,一般不选择。

JDK 自带序列化

实现 java.io.Serializable 接口即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
@ToString
public class RpcRequest implements Serializable {
private static final long serialVersionUID = 1905122041950251207L;
private String requestId;
private String interfaceName;
private String methodName;
private Object[] parameters;
private Class<?>[] paramTypes;
private RpcMessageTypeEnum rpcMessageTypeEnum;
}

serialVersionUID 的作用

serialVersionUID 起到版本控制的作用。反序列化时会检查 serialVersionUID是否和当前类的 serialVersionUID 一致,如果不一致则会抛出 InvalidClassException 异常。如果不手动指定,编译器会动态生成默认的 serialVersionUID

transient 的作用

transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。

  • transient 只能修饰变量,不能修饰类和方法。
  • transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰 int 类型,那么反序列后结果就是 0
  • static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化。

序列化
http://example.com/2024/12/17/序列化/
作者
Moonike
发布于
2024年12月17日
更新于
2025年5月20日
许可协议