transient关键字用于标记字段不参与默认序列化,序列化时忽略该字段,反序列化时赋默认值;适用于保护敏感信息、跳过临时变量或不可序列化类型等场景。

在 Java 中,transient 关键字用于标记某个字段**不参与默认的序列化过程**。当对象被序列化(如写入文件或网络传输)时,被 transient 修饰的字段值不会被保存;反序列化时,该字段会被初始化为对应类型的默认值(如 null、0、false)。
什么时候该用 transient
适用于以下场景:
- 字段包含敏感信息(如密码、密钥),不应持久化或暴露
- 字段是临时计算结果或缓存,无需保存(如
transient int cachedHashCode;) - 字段类型不可序列化(如
Thread、Socket、InputStream等),但又必须保留在类中 - 字段依赖运行时环境(如 Spring 的
ApplicationContext),无法跨 JVM 恢复
基本用法示例
只需在字段声明前加上 transient:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String password; // 不序列化
private transient Thread workerThread; // 不可序列化类型,必须加 transient
// 构造、getter/setter 略
}
序列化后,password 和 workerThread 的值不会写入字节流;反序列化得到的 User 对象中,这两个字段分别为 null 和 null(引用类型默认值)。
注意:transient 不影响自定义序列化逻辑
如果类实现了 writeObject 和 readObject 方法,你仍可在其中手动处理 transient 字段:
-
transient字段不会自动进入默认序列化流程,但你可以主动把它写进去(比如加密后) - 同理,在
readObject中可以主动恢复它(如解密、重新创建线程等) - 此时
transient仅表示“跳过默认行为”,而非“绝对禁止序列化”
常见误区提醒
-
transient只对实例字段有效,不能修饰静态字段(static字段本就不序列化) -
transient不能修饰方法、类或局部变量 - 使用
transient后,若字段需在反序列化后有合理初始值,建议在readObject中显式赋值或使用serialPersistentFields - JSON 序列化(如 Jackson、Gson)不识别
transient—— 它们有自己的注解(如@JsonIgnore)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











