java序列化通过实现空的serializable标记接口告知jvm该类可被序列化;jvm检查接口实现,未实现则抛notserializableexception;需配合objectoutputstream.writeobject()和objectinputstream.readobject()使用,且非transient非static字段类型也须可序列化。

Java 中对象序列化通过实现 Serializable 接口实现,这个接口本身是空的(标记接口),不定义任何方法,它的作用只是告诉 JVM:这个类的实例可以被转换为字节流,从而支持持久化或网络传输。
为什么实现 Serializable 就能序列化?
JVM 内部对实现了 Serializable 的类有特殊处理逻辑。当使用 ObjectOutputStream 写入对象时,JVM 会检查该类是否可序列化——即是否实现了该接口(或其父类/接口满足条件)。若不满足,直接抛出 NotSerializableException。
注意:仅实现接口还不够,类中所有非 transient、非 static 的字段所对应的类型也必须可序列化,否则仍会报错。
基本序列化与反序列化步骤
只需几行代码即可完成:
- 序列化:用
ObjectOutputStream包装一个输出流(如FileOutputStream),调用writeObject() - 反序列化:用
ObjectInputStream包装对应输入流(如FileInputStream),调用readObject() - 要求被读取的对象类在反序列化时必须在 classpath 中,且类结构未发生不兼容变更(如删字段、改类型等)
serialVersionUID 的作用与设置
每个可序列化类都有一个默认的序列版本 UID(由类名、接口、方法、字段等计算得出)。如果类结构变化导致 UID 改变,反序列化会失败(InvalidClassException)。
建议显式声明:private static final long serialVersionUID = 1L; 这样即使类稍作修改(如加注释、改方法体),只要字段保持兼容,UID 不变,反序列化仍可成功。
控制序列化行为的常用方式
可通过以下手段定制序列化过程:
- 用
transient修饰不需要保存的字段(如临时缓存、数据库连接) - 提供私有的
writeObject(ObjectOutputStream)和readObject(ObjectInputStream)方法,自定义写入/读取逻辑(例如加密敏感字段) - 实现
Externalizable接口(继承自Serializable),完全接管序列化流程(需手动写所有字段)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











