java序列化需类实现serializable接口(空标记接口,无方法),并用objectoutputstream.writeobject()手动触发;未实现则抛notserializableexception,transient和static字段不序列化,建议显式声明serialversionuid以确保版本兼容。

Java 序列化通过实现 Serializable 接口,配合 ObjectOutputStream 将对象写入字节流,从而实现持久化。它不是自动发生的,而是一套需手动触发、有明确约束的机制。
必须实现 Serializable 接口
这是一个空的标记接口,不定义任何方法,但它是 JVM 的强制门槛:
- 没实现该接口,调用
writeObject()会立即抛出NotSerializableException - 父类未实现时,子类即使实现了,父类字段也不会被序列化(除非父类也实现或提供无参构造)
- 接口本身不参与逻辑,只起“许可”作用——告诉 JVM:“这个类允许被深度遍历和序列化”
用 ObjectOutputStream 写出对象到文件
序列化动作由 ObjectOutputStream 执行,通常包装一个底层输出流(如 FileOutputStream):
- 创建输出流:
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.ser")); - 调用
out.writeObject(obj),JVM 自动递归处理对象图(包括引用对象,前提是它们也都可序列化) - 操作完成后必须调用
out.close()或使用 try-with-resources 确保资源释放
注意哪些字段不会被保存
并非所有成员变量都会进入字节流:
-
transient修饰的字段会被跳过,反序列化后为默认值(null、0、false) -
static字段天生不参与——它属于类,不属于某个具体实例 - 未实现
Serializable的引用类型字段会导致运行时异常,需提前处理(如改为transient或自行序列化)
建议显式声明 serialVersionUID
这是个 private static final long 类字段,用于标识类的序列化版本:
- 若不显式定义,JVM 会根据类结构自动生成,但字段增删、类型变更等都可能让生成值不同
- 反序列化时若读取的字节流中
serialVersionUID与当前类不匹配,会抛出InvalidClassException - 推荐写法:
private static final long serialVersionUID = 1L;(开发中可根据实际版本号调整)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











