1. 序章

この記事では、最初にtransient キーワードを理解してから、例を通してその動作を確認します。

2. transientの使用法

シリアル化のコンテキストで使用されるtransientに移動する前に、まずシリアル化について理解しましょう。

シリアル化はオブジェクトをバイトストリームに変換するプロセスであり、逆シリアル化はその逆です

変数を一時的なものとしてマークすると、その変数はシリアル化されませんtransient フィールドは、オブジェクトのシリアル化された形式では存在しないため、逆シリアル化プロセスは、シリアル化された形式からオブジェクトを作成するときに、そのようなフィールドのデフォルト値を使用します。

transient キーワードは、いくつかのシナリオで役立ちます。

  • 派生フィールドに使用できます
  • オブジェクトの状態を表さないフィールドに役立ちます
  • シリアル化できない参照に使用します

3. 例

実際の動作を確認するために、まず、オブジェクトをシリアル化するBookクラスを作成しましょう。

public class Book implements Serializable {
    private static final long serialVersionUID = -2936687026040726549L;
    private String bookName;
    private transient String description;
    private transient int copies;
    
    // getters and setters
}

ここでは、descriptionおよびcopystransientフィールドとしてマークしています。

クラスを作成した後、このクラスのオブジェクトを作成します。

Book book = new Book();
book.setBookName("Java Reference");
book.setDescription("will not be saved");
book.setCopies(25);

次に、オブジェクトをファイルにシリアル化します。

public static void serialize(Book book) throws Exception {
    FileOutputStream file = new FileOutputStream(fileName);
    ObjectOutputStream out = new ObjectOutputStream(file);
    out.writeObject(book);
    out.close();
    file.close();
}

ここで、ファイルからオブジェクトを逆シリアル化します。

public static Book deserialize() throws Exception {
    FileInputStream file = new FileInputStream(fileName);
    ObjectInputStream in = new ObjectInputStream(file);
    Book book = (Book) in.readObject();
    in.close();
    file.close();
    return book;
}

最後に、bookオブジェクトの値を確認します。

assertEquals("Java Reference", book.getBookName());
assertNull(book.getDescription());
assertEquals(0, book.getCopies());

ここでは、bookNameが適切に永続化されていることがわかります。 一方、copysフィールドの値は0で、descriptionnull–それぞれのデータ型のデフォルト値です–元の値の代わりに。

4. finalでの動作

次に、[X36X]finalキーワードでtransientを使用する場合を見てみましょう。 そのために、最初に finaltransient要素をBookクラスに追加してから、空のBookオブジェクトを作成します。

public class Book implements Serializable {
    // existing fields    
    
    private final transient String bookCategory = "Fiction";

    // getters and setters
}
Book book = new Book();

最後の修飾子は違いがありません–フィールドはtransient であるため、そのフィールドの値は保存されません。 逆シリアル化中に、新しいBookオブジェクトはBookクラスで定義されたデフォルト値Fictionを取得しますが、その値はシリアル化データから取得されません。

assertEquals("Fiction", book.getBookCategory());

5. 結論

この記事では、transient キーワードの使用法と、シリアル化および逆シリアル化におけるその動作について説明しました。

いつものように、すべてのコードはGitHub利用できます。