transient仅对java原生序列化有效,用于跳过非static实例字段的序列化,反序列化后字段为默认值;对json、orm、redis等无效,应使用对应框架注解。

transient 关键字只在 Java 原生序列化(即 ObjectOutputStream / ObjectInputStream)中起作用,用来跳过指定字段的序列化。它不是通用的“忽略序列化”开关,对 JSON、数据库 ORM、Redis 等完全无效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
transient 的核心行为
- 被
transient修饰的非 static 实例字段,在调用writeObject()时不会写入字节流 - 反序列化后,该字段值为对应类型的默认值:
null(引用类型)、0(数值)、false(boolean) -
static字段本就不参与序列化,加transient无意义 -
transient不影响 getter/setter、不改变编译或运行时逻辑,仅作用于原生序列化流程
正确使用方式
- 类必须实现
Serializable接口 - 字段声明前加
transient修饰符 - 确保该字段确实需要在
ObjectOutputStream场景下被跳过
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private transient String password; // 反序列化后为 null
private transient BigDecimal balanceCache; // 反序列化后为 null
}
常见误用场景(它不起作用的地方)
- 用 Jackson 写 JSON 时,
password仍会输出 → 应改用@JsonIgnore - MyBatis 插入数据库时,
balanceCache还是可能被映射 → 需配合@Select或排除字段映射 - 存进 Redis(用
GenericJackson2JsonRedisSerializer)→transient被忽略,要用@JsonIgnore或自定义序列化器 - 使用 Lombok 的
@Data自动生成toString()时,transient字段仍会被打印 → 因为toString()是运行期方法,和序列化无关
安全与设计建议
- 敏感字段(密码、token、密钥)适合用
transient,但前提是你的系统真走ObjectOutputStream流程 - 缓存类字段(如
tempCache、calculatedScore)标transient合理,避免把运行时中间结果持久化 - 如果项目主要用 JSON 通信或数据库存储,
transient几乎没用,应优先使用框架专属注解:- Jackson:
@JsonIgnore、@JsonInclude(JsonInclude.Include.NON_NULL) - Fastjson:
@JSONField(serialize = false) - MyBatis:
@Select显式指定字段,或 XML 中不写<result></result>映射
- Jackson:
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










