java对象序列化需实现serializable接口并显式定义serialversionuid,用transient修饰敏感字段;通过objectoutputstream包装fileoutputstream写入,fileinputstream配合objectinputstream读取,须严格按顺序调用readobject()还原。

Java对象序列化配合FileOutputStream实现持久化保存,核心是用ObjectOutputStream包装FileOutputStream,把对象转成字节流写入文件。关键不在“能不能”,而在于“怎么写才安全、可恢复、不报错”。
类必须实现 Serializable 接口
这是硬性前提,否则运行时抛 NotSerializableException。接口本身无方法,属于标记接口:
- 在类声明处加上 implements Serializable
- 强烈建议显式定义 private static final long serialVersionUID = 1L;(比如 1L 或基于版本生成的值),避免类结构微调后反序列化失败
- 敏感字段(如密码、临时计算结果)用 transient 修饰,它们不会被写入文件
用 ObjectOutputStream 包装 FileOutputStream 写出
FileOutputStream 负责打开文件并写入原始字节,ObjectOutputStream 在其之上提供对象级写入能力:
- 先创建 FileOutputStream("xxx.obj"),指定文件路径(注意路径权限和父目录存在)
- 再用它构造 ObjectOutputStream:new ObjectOutputStream(fos)
- 调用 writeObject(obj) 写入对象(支持单个或连续多个)
- 务必 关闭流 —— 推荐用 try-with-resources 自动释放,否则数据可能未真正落盘
读取时顺序与类型要严格对应
反序列化不是“猜对象”,而是按写入顺序逐个还原:
- 用 FileInputStream 打开同一文件,再套 ObjectInputStream
- 每次调用 readObject() 返回 Object,需强制转回原类型(如 (User) ois.readObject())
- 如果写了 3 个对象,就必须调用 3 次 readObject();少一次会抛 EOFException,多一次会阻塞或异常
- 若类字段增删但 serialVersionUID 未更新,可能触发 InvalidClassException
数组和引用对象也适用同一规则
一维、二维数组(如 String[][])、集合(ArrayList)、自定义对象嵌套,只要它们自身或元素类型都实现了 Serializable,就能整体序列化:
- String、Integer 等 JDK 常用类已默认实现,无需额外处理
- 若数组含自定义类(如 Person[]),则 Person 类也必须实现 Serializable
- ObjectOutputStream 会递归处理所有非 transient、非 static 的引用对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











