java对象流通过objectoutputstream和objectinputstream实现序列化与反序列化,要求类实现serializable接口并建议显式声明serialversionuid;transient修饰敏感字段;仅非transient、非static字段及可序列化引用被保存;读写顺序需一致,父类未实现serializable则其字段不被序列化。

Java对象流通过ObjectOutputStream和ObjectInputStream实现对象的序列化(保存)与反序列化(恢复),前提是目标类必须实现Serializable接口。
确保类可序列化
只有实现了java.io.Serializable接口的类才能被序列化。该接口是标记接口,无需实现方法,但建议显式声明serialVersionUID以避免版本不兼容问题:
- 在类中添加
private static final long serialVersionUID = 1L; - 若不指定,JVM会根据类结构自动生成,类结构变动可能导致反序列化失败
- 敏感字段(如密码)应加
transient修饰,避免被序列化
使用ObjectOutputStream写入对象
将对象写入文件或字节流时,需包装在ObjectOutputStream中:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
FileOutputStream打开目标文件,再套一层ObjectOutputStream - 调用
writeObject(Object obj)写入对象(支持单个或多个) - 务必调用
close()或flush()确保数据落盘 - 注意:仅对象本身及其非
transient、非static字段被序列化;引用对象也需可序列化
使用ObjectInputStream读取对象
从文件恢复对象时,顺序需与写入一致:
- 用
FileInputStream打开文件,再套ObjectInputStream - 调用
readObject()返回Object,需强制转型为原类型 - 多次写入则需按相同次数调用
readObject(),否则抛EOFException - 若类定义变更(如删字段),而
serialVersionUID未更新,可能抛InvalidClassException
注意事项与常见问题
序列化看似简单,但实际使用中容易踩坑:
- 父类未实现
Serializable时,其字段不会被序列化(除非父类也实现) - 集合类(如
ArrayList)本身可序列化,但其中元素类型也必须可序列化 - 不能序列化线程、Socket、数据库连接等运行时资源,这些字段必须声明为
transient - 反序列化不调用构造方法,而是由JVM直接分配内存并还原字段值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










