java对象序列化需实现serializable接口,它作为jvm识别的标识;须定义serialversionuid、用transient修饰非持久字段;通过objectoutputstream写入、objectinputstream读取;特殊需求可重写writeobject/readobject方法。

Java对象序列化保存状态,核心就是让类实现Serializable接口,并用ObjectOutputStream写入字节流。它不关心你写了多少方法,只认这个“可序列化”的身份标记。
为什么必须实现 Serializable 接口
这是一个空接口(没有方法),纯粹起标识作用。JVM看到这个接口,才允许把对象转成字节流;没实现就调用writeObject(),立刻抛NotSerializableException。它就像一张通行证——没它,序列化流程直接拒载。
怎么写一个可序列化的类
只需在类声明后加上implements Serializable,其他照常写字段和方法。但有几点关键细节要注意:
- 强烈建议手动定义
private static final long serialVersionUID = 1L;,否则JVM自动生成,类结构稍有改动(比如加个字段)就可能导致反序列化失败 - 不想保存的字段(比如临时计算值、数据库连接、密码等),用
transient修饰,序列化时自动跳过 - 父类不可序列化?子类仍可实现
Serializable,但父类字段不会被保存,除非父类有可访问的无参构造器,反序列化时靠它重初始化
怎么把对象真正存到文件里
两步走:先建输出流,再写对象。
- 用
FileOutputStream打开文件,再套一层ObjectOutputStream - 调用
oos.writeObject(obj),一行代码完成序列化 - 别忘了关闭流(或用try-with-resources自动管理)
反序列化反过来:用FileInputStream + ObjectInputStream,然后ois.readObject()拿到原对象(注意返回是Object,需强制转型)。
什么时候需要自己控制序列化过程
大多数情况默认机制够用。但遇到以下场景,就得重写private void writeObject(ObjectOutputStream out)和private void readObject(ObjectInputStream in):
- 字段加密/解密(比如密码字段写入前加密,读出后解密)
- 某些字段逻辑上不该序列化,但又不能加
transient(比如因继承关系受限) - 需要在序列化前后执行清理或初始化动作(如关闭资源、校验数据)
- 兼容老版本数据格式(比如旧版多一个字段,新版要默认赋值)
重写时记得调用out.defaultWriteObject()或in.defaultReadObject()来保留默认字段处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











