序列化

将对象转换成字节流的过程。这样对象就可以通过网络传输,持久化存储或者缓存。
Java提供了java.io.serializablr接口来支持序列化,只要实现这个接口,就可以将该类的对象进行序列化。

反序列化

将字节流重新转换为对象的过程。也就是从存储中读取数据并重新创建对象。

Java序列化关键类和接口

ObjectOutputStream用于序列化,ObjectInputStream用于反序列化。类必须实现Serializable接口才能被序列化。
在序列化过程中,可以用transient关键字来标记不需要序列化的字段。

安全性

反序列化是一个潜在的安全风险。因为通过恶意构造的字节流,可能会加载不安全的类或执行不期望的代码。因此,反序列化过程需要进行输入验证,避免反序列化漏洞。

serialVersionUID

private static final long serizlVersionUID = 1L;

这个ID其实就是用来验证序列化的对象和反序列化的对象的ID是否一致。
这个ID数字其实不重要,无论是1L还是idea自动生成,只要序列化的时候对象的serialVersionUID和反序列化的serialVersionUID一致的话就行。
如果没有显式指定 serialVersionUID,则编译器会根据类的相关信息自动生成
一个,可以认为是一个指纹。

所以如果你没有定义一个serialVersionUID然后序列化一个对象之后,在反序
列化之前把对象的类的结构改了,比如增加了一个成员变量,则此时的反序列
化会失败。

因为类的结构变了,生成的指纹就变了,所以serialVersionUID就不一致了。

所以 serialVersionUID 就是起验证作用。

注意,Java序列化不包含静态变量

·