Java对象序列化需实现Serializable接口,用ObjectOutputStream写入、ObjectInputStream读取,transient字段不序列化,静态字段和父类非Serializable字段不保存,建议显式定义serialVersionUID。

Java 对象要保存到文件并能重新读取还原,需通过序列化(Serialization)与反序列化(Deserialization)实现。核心前提是:该类必须实现 Serializable 接口(标记接口,无方法),然后借助 ObjectOutputStream 和 ObjectInputStream 完成写入与读取。
对象必须实现 Serializable 接口
这是序列化的前提。不实现该接口,运行时会抛出 NotSerializableException。
- 只需在类声明后加上
implements Serializable - 建议显式定义
private static final long serialVersionUID = 1L;,避免因类结构变化导致反序列化失败 - 被
transient修饰的字段不会被序列化(如密码、临时缓存等敏感或非持久化数据)
用 ObjectOutputStream 将对象写入文件
将对象转为字节流并保存为文件(如 user.dat):
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 创建
FileOutputStream指向目标文件 - 用它包装一个
ObjectOutputStream - 调用
writeObject(obj)写入对象(支持单个对象,也支持集合) - 务必关闭流(推荐 try-with-resources 自动释放)
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) {<br> oos.writeObject(user);<br>}
用 ObjectInputStream 从文件读取并还原对象
从文件中恢复原始 Java 对象:
立即学习“Java免费学习笔记(深入)”;
- 创建
FileInputStream打开序列化文件 - 用它包装一个
ObjectInputStream - 调用
readObject(),返回Object类型,需强制转型为原类型 - 注意:读取顺序和写入顺序必须一致;若文件为空或损坏,会抛出异常(如
EOFException、ClassNotFoundException)
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) {<br> User user = (User) ois.readObject();<br>}
注意事项与常见问题
实际使用中容易踩坑,需特别留意:
- 所有嵌套的成员对象(包括集合里的元素)也必须可序列化,否则报错
- 静态字段(
static)不参与序列化(属于类,不属于对象实例) - 父类未实现
Serializable,子类仍可序列化,但父类字段值在反序列化后为默认值(如null、0) - 反序列化时类路径或版本不一致(如
serialVersionUID不匹配),会抛InvalidClassException - 不推荐在生产环境长期依赖 Java 原生序列化(安全性低、兼容性差),如需跨语言或长期存储,建议用 JSON(Jackson/Gson)或 Protobuf

















