Javaにおけるtransientの役割は何ですか?

Javaでは、transientキーワードはクラスのメンバ変数を修飾するために使用され、修飾された変数やプロパティをオブジェクトの直列化時に無視するようコンパイラに指示します。つまり、オブジェクトの永続化操作に参加しないようにします。

Javaオブジェクトがシリアライズされる必要がある場合(すなわち、格納や転送などの操作のためにバイトストリームに変換される場合)、すべてのメンバ変数が自動的にシリアライズされます。ただし、パスワードや一時変数など、一部のメンバ変数をシリアライズしてはいけない場合があります。そのような場合、これらの変数をtransientキーワードで修飾し、シリアライズプロセス中に無視されるようにします。

例えば、Userクラスがあり、その中にはユーザー名とパスワードの2つのメンバ変数が含まれているとします。 Userオブジェクトをシリアライズする際に、パスワードがバイトストリームにシリアライズされることを望まない場合、パスワードメンバ変数をtransientと宣言すると、シリアライズプロセス中にパスワードが無視され、ユーザー名のみがシリアライズされます。

public class User implements Serializable {
    private String username;
    private transient String password;
    
    // 省略构造方法、getter和setter等
    
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

Userオブジェクトをシリアライズおよびデシリアライズする際には、パスワードフィールドは無視されます。

User user = new User("Alice", "123456");
System.out.println("Before serialization: " + user);
 
// 对User对象进行序列化
try (FileOutputStream fos = new FileOutputStream("user.ser");
     ObjectOutputStream oos = new ObjectOutputStream(fos)) {
    oos.writeObject(user);
}
 
// 对User对象进行反序列化
try (FileInputStream fis = new FileInputStream("user.ser");
     ObjectInputStream ois = new ObjectInputStream(fis)) {
    User deserializedUser = (User) ois.readObject();
    System.out.println("After deserialization: " + deserializedUser);
}

結果は次の通りです:

Before serialization: User{username='Alice', password='123456'}
After deserialization: User{username='Alice', password='null'}

出力結果から、逆シリアル化後に取得されたUserオブジェクトのパスワードフィールドの値はnullであり、無視されていることがわかります。

bannerAds