Java中的序列化与反序列化
序列化
将对象转换成字节流的过程。这样对象就可以通过网络传输,持久化存储或者缓存。
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序列化不包含静态变量
·
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 被淹死的鱼!
评论