Java对象序列化需实现Serializable接口作为标记,配合ObjectOutputStream/ObjectInputStream完成存取;transient和static字段不被序列化,父类未实现该接口时其字段也不序列化,建议显式声明serialVersionUID。

Java 中对象序列化要实现 Serializable 接口,核心不是“写方法”,而是给类打上可序列化的标记,并配合标准 I/O 流完成对象的存取。它本身不定义任何方法,只是一个语义契约。
让类声明实现 Serializable
在类定义后加上 implements Serializable 即可,这是最基本前提:
- 不加该接口,调用
ObjectOutputStream.writeObject()会直接抛NotSerializableException - 建议显式声明
private static final long serialVersionUID = 1L;,避免类结构微调(如增删字段)导致反序列化失败 - IDE 通常支持自动生成固定值,比 JVM 自动生成更稳定
注意哪些字段不会被序列化
默认情况下,只有实例状态会被保存,以下两类字段自动排除:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
transient修饰的字段:比如密码、临时缓存、数据库连接等敏感或不可持久化的内容 -
static字段:属于类而非对象,不在序列化范围内 - 父类未实现
Serializable时,其字段不会被序列化;反序列化时会调用父类无参构造器初始化
用 ObjectOutputStream 和 ObjectInputStream 操作
接口只是“准入证”,真正读写必须靠这两个流:
立即学习“Java免费学习笔记(深入)”;
- 序列化:用
ObjectOutputStream包装文件输出流,再调用writeObject(obj) - 反序列化:用
ObjectInputStream包装文件输入流,再调用readObject()并强制转型 - 对象及其所有非
transient、非static字段的类型,都必须可序列化(即也实现Serializable,或为基本类型、String 等内置可序列化类型)
常见问题与规避方式
看似简单,但几个细节容易出错:
- 集合类(如
ArrayList、HashMap)本身可序列化,但其中元素类型仍需各自支持序列化 - Lambda 表达式、匿名内部类可能捕获了外部不可序列化对象,导致失败
- 若需精细控制(如跳过某些字段、兼容老版本),可自定义
private void writeObject(ObjectOutputStream)和private void readObject(ObjectInputStream)方法

















