transient 关键字使字段在 Java 原生序列化中被跳过,生效需满足:类实现 Serializable 接口,且字段为 private transient 实例变量;适用于敏感数据、不可序列化类型及纯运行时状态。

用 transient 关键字跳过指定属性的序列化,只需在字段声明前加上 transient 修饰符,并确保类已实现 Serializable 接口。它不改变字段运行时行为,只让 Java 原生序列化机制(ObjectOutputStream)忽略该字段。
怎么写才生效
必须满足两个基本条件:
- 类要实现
java.io.Serializable接口(哪怕空实现) - 目标字段是实例变量(不能是
static或方法局部变量),且声明为private transient 类型 字段名
例如:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private transient String password; // 反序列化后为 null
private transient int loginCount; // 反序列化后为 0
}
哪些字段适合加 transient
加 transient 不是随意而为,重点看字段是否符合以下情况之一:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
- 含敏感数据:如密码、token、密钥等,避免明文落盘或网络暴露
- 不可序列化类型:比如
Thread、Socket、Connection等未实现Serializable的对象 - 纯运行时状态:如缓存结果、临时计数器、上次更新时间戳——这些值在反序列化后通常已失效或需重算
要注意的关键限制
transient 的作用范围很明确,也容易误用:
- 对 JSON(Jackson/Gson)、XML、数据库 ORM 等序列化方式默认无效,需额外加注解(如
@JsonIgnore) - 若类中重写了
writeObject和readObject,并在里面手动写入/读取了transient字段,那它依然会被序列化 - 不能修饰
static字段(本来就不参与序列化),也不建议修饰final字段(编译通过但语义错误,反序列化后可能引发逻辑异常) - 它不加密、不擦除内存、不影响日志打印或调试器查看——仅跳过字节流层面的读写
验证是否起作用的小技巧
最直接的方式是写一个最小测试:
- 创建对象并赋值(包括
transient字段) - 用
ObjectOutputStream序列化到文件 - 再用
ObjectInputStream反序列化出来 - 打印该字段值:如果是引用类型输出
null,基本类型输出默认值(如0、false),就说明transient生效了

















