java中可通过私有writeobject和readobject方法在序列化/反序列化时插入自定义逻辑:二者须严格符合签名、private修饰、手动调用defaultwriteobject/defaultreadobject,支持transient字段处理及状态修复,但不继承、不适用于externalizable类。

Java 中可以通过实现 writeObject 和 readObject 这两个私有方法,在序列化和反序列化过程中插入自定义逻辑,无需额外接口或注解,JVM 会在对应阶段自动调用它们。
使用 private writeObject() 实现序列化前回调
该方法必须是私有的、无返回值、参数为 ObjectOutputStream,且需手动调用 out.defaultWriteObject() 来触发默认序列化流程。你可以在调用前后添加任意处理逻辑,比如日志记录、字段预处理、加密准备等。
- 方法签名严格为:
private void writeObject(ObjectOutputStream out) throws IOException - 必须显式调用
out.defaultWriteObject(),否则对象字段不会被序列化 - 可在其前后执行任意代码,例如:
System.out.println("即将序列化...") - 若对象含
transient字段,可在此方法中单独写入(如用out.writeObject(...))
使用 private readObject() 实现反序列化后回调
该方法同样为私有,参数为 ObjectInputStream,也必须显式调用 in.defaultReadObject() 完成默认反序列化。之后即可执行初始化、校验、资源重建等操作。
- 方法签名固定为:
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException -
defaultReadObject()必须在读取自定义字段之前调用,确保基础字段已恢复 - 若之前用
writeObject手动写了transient字段,这里要用in.readObject()对应读取并赋值 - 适合做对象状态修复,比如重建
ThreadLocal、重置缓存、验证数据完整性
注意事项与常见陷阱
这类回调不是“事件监听”,而是 JVM 序列化机制内置的钩子方法,依赖严格的命名和签名。一旦拼错、访问修饰符不对或抛出未声明异常,就会跳过执行,甚至导致 InvalidClassException。
- 方法必须是
private,不能是public或protected - 不能被继承,子类需自行重写才能生效
- 不适用于
Externalizable实现类——它会完全绕过writeObject/readObject - 若类定义了
serialVersionUID,升级字段时要谨慎,否则反序列化可能失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











