要让自定义类支持Java序列化,必须实现Serializable接口并显式声明serialVersionUID;用transient修饰不可序列化字段;确保所有成员变量类型也实现Serializable。

自定义类必须实现 Serializable 接口
这是最基本的前提。`Serializable` 是一个空接口(标记接口),不包含任何方法,仅用于告诉 JVM:“这个类的对象允许被序列化”。
例如:
public class User implements Serializable {
private String name;
private int age;
// 构造器、getter/setter 省略
}
显式声明 serialVersionUID(强烈推荐)
如果不手动指定,JVM 会根据类名、字段、方法等自动生成一个 `serialVersionUID`。但一旦类结构变动(比如增删字段),生成的值可能变化,导致反序列化时抛出 InvalidClassException。
建议始终显式定义:
- 用
private static final long serialVersionUID = 1L;(可按需修改数字) - IDE(如 IntelliJ 或 Eclipse)通常能自动生成基于当前类结构的固定值,更稳妥
处理不可序列化的字段:transient 关键字
有些字段不该或不能被序列化,比如数据库连接、线程、临时计算结果等。用 transient 修饰即可跳过:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
private transient Connection dbConnection; // 不参与序列化 private String username; // 正常序列化
反序列化后,`transient` 字段会被设为默认值(如 null、0、false)。
确保所有成员变量类型也支持序列化
如果类中引用了其他对象(比如嵌套对象、集合元素),这些类型本身也得实现 `Serializable`,否则运行时报 NotSerializableException。
例如:
-
private List<Address> addresses;→Address类也要实现Serializable -
private Date createTime;→Date已实现,没问题 -
private Thread worker;→Thread没实现,必须用transient或替换

















