java对象支持序列化需实现serializable接口,显式声明serialversionuid,注意static和transient字段不参与序列化,用objectoutputstream写入、objectinputstream读取并处理异常。

让 Java 对象支持序列化与反序列化,核心就是实现 Serializable 接口,并配合 ObjectOutputStream 和 ObjectInputStream 完成读写操作。这不是一个复杂流程,但有几个关键点必须到位,否则运行时会直接报错。
类必须显式实现 Serializable 接口
这是最基础也是强制性的前提。接口本身没有方法,纯粹是给 JVM 的“通行证”:
- 不实现该接口,调用
writeObject()会抛出NotSerializableException - 接口对字段访问修饰符无要求——
private字段默认也会被序列化 - 父类未实现
Serializable,子类实现后,仅子类声明的字段参与序列化(父类字段丢失)
建议显式声明 serialVersionUID
这个静态常量用于校验版本兼容性,避免因类结构变动导致反序列化失败:
- 若不声明,JVM 会根据类名、字段、方法等自动生成一个哈希值;类稍作修改(如加个字段),哈希值就变,反序列化时抛
InvalidClassException - 显式定义后(如
private static final long serialVersionUID = 1L;),只要不删改关键字段,旧数据仍可正常还原 - ID 值可用 IDE 自动生成,或手动指定整数,保持长期稳定即可
注意哪些字段不会被序列化
序列化默认处理所有非 static、非 transient 的实例字段:
-
static字段属于类,不属于对象状态,自动跳过 -
transient字段明确标记为“暂态”,比如密码、临时缓存等敏感或易重建的数据,不会写入字节流 - 被
transient修饰的字段,反序列化后为默认值(null、0、false等)
使用 ObjectOutputStream 和 ObjectInputStream 进行读写
序列化和反序列化是两个独立操作,分别依赖对应的流类:
- 序列化:用
ObjectOutputStream包装任意OutputStream(如FileOutputStream或ByteArrayOutputStream),再调用writeObject(obj) - 反序列化:用
ObjectInputStream包装对应输入流(如FileInputStream),再调用readObject()并强制转型为目标类型 - 务必捕获
IOException和ClassNotFoundException(后者因类路径中找不到对应类而触发)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











