Java对象序列化需实现Serializable接口,声明serialVersionUID,transient和static字段不参与;用ObjectOutputStream写入、ObjectInputStream读取;注意兼容性与反序列化安全风险,推荐JSON等替代方案。

Java 中对象序列化通过实现 Serializable 接口并配合 ObjectOutputStream 和 ObjectInputStream 完成,核心是将对象状态转为字节流以便存储或传输。
让类支持序列化
只需让目标类实现 java.io.Serializable 接口(空接口,无方法):
- 推荐显式声明 private static final long serialVersionUID 字段,避免因类结构变化导致反序列化失败
- 被 transient 修饰的字段不会被序列化(如敏感信息、临时计算结果)
- 静态字段(static)默认不参与序列化,因为不属于对象实例状态
序列化对象到文件或字节流
使用 ObjectOutputStream 将对象写入输出流:
- 必须确保对象及其所有非 transient 成员都可序列化(否则抛 NotSerializableException)
- 典型写法:用 FileOutputStream 包装 ObjectOutputStream,调用 writeObject()
- 示例:out.writeObject(new User("Alice", 25));
从字节流还原对象(反序列化)
使用 ObjectInputStream 读取并重建对象:
立即学习“Java免费学习笔记(深入)”;
- 输入流必须是之前序列化生成的合法字节流,否则抛 InvalidClassException 或 StreamCorruptedException
- 反序列化会调用类的无参构造器(仅用于初始化,不执行构造逻辑),然后直接填充字段值
- 若类定义了 private void readObject(ObjectInputStream in) 方法,可自定义反序列化过程
注意兼容性与安全性
序列化不是长期存储格式,需谨慎使用:
- 类结构变更(如删字段、改类型)可能破坏旧数据兼容性,serialVersionUID 能帮助识别版本不匹配
- 反序列化不受控数据存在安全风险(如恶意构造字节流触发任意代码执行),生产环境建议禁用或使用白名单机制
- 替代方案更推荐:JSON(Jackson/Gson)、Protocol Buffers、Avro 等语言中立、可读性强、版本友好的序列化方式


















