序列化
本文最后更新于 2025年5月20日 14:24
序列化和反序列化
- 序列化:将数据结构或对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是 JSON, XML 等文本格式
- 反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程
常用场景
- 网络传输:对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
- 持久化:将对象存储到文件、数据库或内存之前需要进行序列化,将对象从文件、数据库或内存中读取出来需要进行反序列化;
常见序列化协议
JDK 自带序列化因为效率低和不安全所以不经常用,常用的有Hessian、Kryo、Protobuf、ProtoStuff,这些都是基于二进制的序列化协议。
JSON 和 XML 这种属于文本类序列化方式。虽然可读性比较好,但是性能较差,一般不选择。
JDK 自带序列化
实现 java.io.Serializable
接口即可
1 |
|
serialVersionUID
的作用
serialVersionUID
起到版本控制的作用。反序列化时会检查 serialVersionUID
是否和当前类的 serialVersionUID
一致,如果不一致则会抛出 InvalidClassException
异常。如果不手动指定,编译器会动态生成默认的 serialVersionUID
。
transient
的作用
transient
关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient
修饰的变量值不会被持久化和恢复。
transient
只能修饰变量,不能修饰类和方法。transient
修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰int
类型,那么反序列后结果就是0
。static
变量因为不属于任何对象(Object),所以无论有没有transient
关键字修饰,均不会被序列化。
序列化
http://example.com/2024/12/17/序列化/