transient 关键字是一个类成员变量的修饰符,用于标记某个类的字段不参与序列化。当一个对象通过序列化机制,例如 ObjectOutputStream,保存到文件或传输时, transient 修饰的字段将不会被序列化,也就是说它不会被保存或传输。

用途

  • 避免敏感数据被序列化:如果对象中包含敏感数据,比如密码,可以使用 transient 关键字避免这些数据被序列化,以确保安全。
  • 非持久化字段:有些字段可能不需要持久化,比如某些仅在内存中使用的缓存数据、计算结果等。这类字段标记为 transient 后,即使对象被序列化,这些字段的值也不会被保存。
  • 外部引用:如果对象持有一个对外部资源的引用,比如文件句柄、网络连接等,这些资源通常不适合序列化。将这些成员变量声明为 transient 可以防止尝试序列化这些外部资源。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.Serializable;

public class User implements Serializable {

@Serial
private static final long serialVersionUID = 1L;

private String username;

private transient String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

@Override
public String toString() {
return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}';
}
}

在这个例子中,password 字段被 transient 修饰,意味着当 User 对象序列化时,password 字段的值将不会被保存。

注意事项

  • 在反序列化过程中,transient 字段会被恢复为其默认值:

    • 对象类型反序列化为 null
    • 基础数据类型如 int0booleanfalse 等等。
  • transient 修饰静态变量时不起作用

相关链接

OB tags

#Java