transient 会影响 Java 序列化,但只是“部分影响”,具体说明如下:
transient 的作用在 Java 中:
transient 修饰的成员变量 不会被序列化null、0、false 等)ObjectOutputStream)class User implements Serializable {
String name;
transient String password; // 不会被序列化
}
序列化时:
name ✅ 被写入password ❌ 不写入反序列化后:
password == null如果你实现了以下方法,transient 可以被“绕过”:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(password); // 手动序列化
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
password = (String) in.readObject(); // 手动反序列化
}
➡ 此时 transient 不生效
transient 只对 JDK 原生序列化有效:
| 序列化方式 | transient 是否生效 |
|---|---|
| Java 原生 Serializable | ✅ 生效 |
| JSON(Jackson / Gson) | ❌ 不生效 |
| Protobuf | ❌ 不生效 |
| Kryo | ❌ 不生效 |
例如 Jackson:
@JsonIgnore
private String password; // 用注解控制
transient会影响 JDK 原生序列化,使其字段不被序列化,但不影响 JSON 等其他序列化方式,也可被自定义序列化绕过。
如果你有具体场景(如分布式、缓存、RPC),我可以帮你判断该不该用 transient。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。