# java序列化
- 将对象表示成字节序列,写入文件。通过反序列化,将它从文件中读取成对象
- 序列化是jvm独立的,即在一个平台上序列化的对象,可以在一个完全不同的平台上反序列化。
- 序列化通过对象流实现,包括
ObjectInputStream
以及ObjectOutputStream
# 为什么要序列化
- 字节流可以用于网络传输和磁盘存储,而对象无法
- java对象保存在jvm的堆内存中,序列化提供了可以把**对象保存下来(持久化)**的方案
# serialVersionUID序列化版本号
- 对象的序列化版本标识
- 用于确保:发送方发送的和接收方接受的是可兼容的对象,注意不是同一个对象,如果序列化版本标识不一致,反序列化时抛出
InvalidClassException
# serialVersionUID规则
- 没有指定时,java会自动为每个序列化类生成,类文件的类名,方法名发送改变,serialVersionUID就会改变。
- 空格、换行、注释不会引起序列化版本号变化
# 序列化的条件
- 该类必需实现
java.io.Serializable
接口 - 该类的所有属性必须是可序列化的,通过
transient
关键字表明其为短暂属性,不进行序列化 - 某些场景,比如RedisSession,对象中存在不可序列化的属性时,且没有标识为短暂属性,会报错;
# 序列化注意事项
- 根据java标准约定,对象序列化的文件以**.ser作为扩展名**
# 反序列化
当serialVersionUID改变时,必须重新序列化后,再进行反序列化.
没有实现序列化的类,不会参与序列化和反序列化(但序列化和反序列化流程本身并不会报错.).