transient修飾子をフィールドに付けると、そのフィールドはシリアライズ対象から除外されます。つまり、オブジェクトがシリアライズされる際にそのフィールドの値は保存されず、デシリアライズ(逆シリアライズ)された後に初期値が設定されます。
transient修飾子を使う一般的なケースは、セキュリティ上の理由や、一時的なデータ(キャッシュなど)を含むフィールドをシリアライズから除外する場合です。また、ファイルパスやネットワーク接続などの外部リソースへの参照を持つフィールドもtransientにすることができます。
以下に、transientキーワードの使い方とオブジェクトのシリアライズの例を示します。
import java.io.*;
class MyClass implements Serializable {
private String nonTransientField;
private transient String transientField;
public MyClass(String nonTransientField, String transientField) {
this.nonTransientField = nonTransientField;
this.transientField = transientField;
}
public String getNonTransientField() {
return nonTransientField;
}
public String getTransientField() {
return transientField;
}
}
public class SerializationExample {
public static void main(String[] args) {
MyClass obj = new MyClass("Hello", "World");
// オブジェクトをシリアライズしてファイルに保存
try (FileOutputStream fos = new FileOutputStream("data.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
// ファイルからオブジェクトをデシリアライズして読み込み
try (FileInputStream fis = new FileInputStream("data.ser");
ObjectInputStream ois = new ObjectInputStream(fis)) {
MyClass newObj = (MyClass) ois.readObject();
System.out.println(newObj.getNonTransientField()); // 出力: Hello
System.out.println(newObj.getTransientField()); // 出力: null
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
この例では、MyClass
というシリアライズ可能なクラスを定義しています。nonTransientField
はtransient修飾子を持たず、シリアライズされます。一方、transientField
はtransient修飾子を持ち、シリアライズから除外されます。
main
メソッドでは、MyClass
のオブジェクトをシリアライズしてファイルに保存し、その後デシリアライズして読み込んでいます。デシリアライズ後にgetTransientField
メソッドでtransientField
の値を取得すると、初期値のnull
が返されます。
Javaでは、オブジェクトをシリアライズ(直列化)してストリームに書き込むことができます。シリアライズされたオブジェクトは、ネットワークを介して送信したり、ディスクに保存したりするのに便利です。しかし、すべてのフィールドをシリアライズする必要はありません。一部のフィールドはシリアライズしない方が望ましい場合があります。そのような場合に、Javaでは「transient」というキーワードを使用します。
transient修飾子をフィールドに付けると、そのフィールドはシリアライズ対象から除外されます。つまり、オブジェクトがシリアライズされる際にそのフィールドの値は保存されず、デシリアライズ(逆シリアライズ)された後に初期値が設定されます。
transient修飾子を使う一般的なケースは、セキュリティ上の理由や、一時的なデータ(キャッシュなど)を含むフィールドをシリアライズから除外する場合です。また、ファイルパスやネットワーク接続などの外部リソースへの参照を持つフィールドもtransientにすることができます。
以下に、transientキーワードの使い方とオブジェクトのシリアライズの例を示します。
import java.io.*;
class MyClass implements Serializable {
private String nonTransientField;
private transient String transientField;
public MyClass(String nonTransientField, String transientField) {
this.nonTransientField = nonTransientField;
this.transientField = transientField;
}
public String getNonTransientField() {
return nonTransientField;
}
public String getTransientField() {
return transientField;
}
}
public class SerializationExample {
public static void main(String[] args) {
MyClass obj = new MyClass("Hello", "World");
// オブジェクトをシリアライズしてファイルに保存
try (FileOutputStream fos = new FileOutputStream("data.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
// ファイルからオブジェクトをデシリアライズして読み込み
try (FileInputStream fis = new FileInputStream("data.ser");
ObjectInputStream ois = new ObjectInputStream(fis)) {
MyClass newObj = (MyClass) ois.readObject();
System.out.println(newObj.getNonTransientField()); // 出力: Hello
System.out.println(newObj.getTransientField()); // 出力: null
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
この例では、MyClass
というシリアライズ可能なクラスを定義しています。nonTransientField
はtransient修飾子を持たず、シリアライズされます。一方、transientField
はtransient修飾子を持ち、シリアライズから除外されます。
main
メソッドでは、MyClass
のオブジェクトをシリアライズしてファイルに保存し、その後デシリアライズして読み込んでいます。デシリアライズ後にgetTransientField
メソッドでtransientField
の値を取得すると、初期値のnull
が返されます。
transientキーワードは、シリアライズの制御やオブジェクトのセキュリテ