# Serializable
- 对于 Java 对象来说,如果使用 JDK 的序列化实现。对象需要实现 java.io.Serializable 接口。
- 可以使用 ObjectOutputStream() 和 ObjectInputStream() 对对象进行序列化和反序列化。
- 序列化的时候会调用 writeObject() 方法,把对象转换为字节流。把对象转换为字节序列的过程称为对象的序列化
- 反序列化的时候会调用 readObject() 方法,把字节流转换为对象。把字节序列恢复为对象的过程称为对象的反序列化。
- Java 在反序列化的时候会校验字节流中的 serialVersionUID 与对象的 serialVersionUID 时候一致。如果不一致就会抛出 InvalidClassException 异常。官方强烈推荐为序列化的对象指定一个固定的 serialVersionUID。否则虚拟机会根据类的相关信息通过一个摘要算法生成,所以当我们改变类的参数的时候虚拟机生成的 serialVersionUID 是会变化的。
transient 关键字修饰的变量 不会 被序列化为字节流- 再也不敢随便改serialVersionUID了
序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。类通过实现
java.io.Serializable接口以启用其序列化功能。在没有定义serialVersionUID的时候,会调用computeDefaultSUID方法,生成一个默认的serialVersionUID
# 再也不敢随便改serialVersionUID了
拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致
serialVersionUID是用来验证版本一致性的。所以在做兼容性升级的时候,不要改变类中serialVersionUID的值
# 啥时候需要序列化
- 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
- 当你想用套接字在网络上传送对象的时候;
- 当你想通过RMI传输对象的时候;
对象文件操作
- ObjectOutputStream代表对象输出流:
它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 - ObjectInputStream代表对象输入流:
它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。