# java序列化

  • 将对象表示成字节序列,写入文件通过反序列化,将它从文件中读取成对象
  • 序列化是jvm独立的,即在一个平台上序列化的对象,可以在一个完全不同的平台上反序列化。
  • 序列化通过对象流实现,包括ObjectInputStream以及ObjectOutputStream

# 为什么要序列化

  • 字节流可以用于网络传输和磁盘存储,而对象无法
  • java对象保存在jvm的堆内存中,序列化提供了可以把**对象保存下来(持久化)**的方案

# serialVersionUID序列化版本号

  • 对象的序列化版本标识
  • 用于确保:发送方发送的和接收方接受的是可兼容的对象注意不是同一个对象,如果序列化版本标识不一致,反序列化时抛出InvalidClassException

# serialVersionUID规则

  • 没有指定时,java会自动为每个序列化类生成,类文件的类名,方法名发送改变,serialVersionUID就会改变。
  • 空格、换行、注释不会引起序列化版本号变化

# 序列化的条件

  • 该类必需实现java.io.Serializable接口
  • 该类的所有属性必须是可序列化的,通过transient关键字表明其为短暂属性,不进行序列化
  • 某些场景,比如RedisSession,对象中存在不可序列化的属性时,且没有标识为短暂属性,会报错;

# 序列化注意事项

  • 根据java标准约定,对象序列化的文件以**.ser作为扩展名**

# 反序列化

  • 当serialVersionUID改变时,必须重新序列化后,再进行反序列化.

  • 没有实现序列化的类,不会参与序列化和反序列化(但序列化和反序列化流程本身并不会报错.).