Javaでのtransientの使い方は何ですか?
Javaで、transientキーワードはクラスのメンバ変数を修飾するために使用され、そのメンバ変数はデフォルトのシリアル化メカニズムによってシリアル化されないことを示します。
オブジェクトがシリアル化されると、すべてのメンバ変数がシリアル化され、それから送信またはディスクに保存されることができます。しかし、敏感情報や重要でない一時データのように、時々メンバ変数の一部をシリアル化する必要がない場合があります。このような場合、transientキーワードを使用してこれらのメンバ変数をマークし、シリアライズされないようにします。
transientキーワードで修飾されたメンバ変数は、シリアライズプロセス中に無視されます。オブジェクトが逆シリアル化されると、これらのメンバ変数の値はデフォルト値(数値型は0、参照型はnull)に戻ります。
例を挙げます。
import java.io.Serializable;
public class Person implements Serializable {
private String name; // 会被序列化
private transient String password; // 不会被序列化
// 构造方法,getter和setter等省略...
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
上記の例では、nameメンバ変数はシリアライズされ、一方、passwordメンバ変数はtransient修飾されており、シリアライズされません。Personオブジェクトをシリアライズすると、passwordフィールドは無視されます。
import java.io.*;
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", "123456");
// 序列化对象
try (FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化对象
try (FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Person deserializedPerson = (Person) in.readObject();
System.out.println(deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
上記の例では、Personオブジェクトがシリアライズされてperson.serファイルに保存されます。そして、そのファイルからオブジェクトがデシリアライズされ、表示されます。デシリアライズされたオブジェクトのpasswordフィールドの値はnullであり、nameフィールドの値はAliceであることが確認できます。