1. ホーム
  2. java

[解決済み] なぜJavaにはtransientフィールドがあるのですか?

2022-03-16 20:48:08

質問

なぜJavaには 過渡的 フィールドがあります。

どのように解決するのですか?

その transient キーワードは、あるフィールドが直列化(ファイルへの保存など)プロセスの一部であってはならないことを示すために使用されます。

から Java言語仕様、Java SE 7版 , 8.3.1.3項を参照。 transient 分野 :

変数にマークが付くことがあります transient を使用します。 の一部ではないことを示す。 オブジェクトの永続的な状態です。

例えば、他のフィールドから派生したフィールドがあり、その状態をシリアライズによって永続化させるのではなく、プログラムによってのみ行われるべきです。

ここでは GalleryImage クラスは、画像とその画像から派生したサムネイルを含んでいます。

class GalleryImage implements Serializable
{
    private Image image;
    private transient Image thumbnailImage;

    private void generateThumbnail()
    {
        // Generate thumbnail.
    }

    private void readObject(ObjectInputStream inputStream)
            throws IOException, ClassNotFoundException
    {
        inputStream.defaultReadObject();
        generateThumbnail();
    }    
}

この例では thumbnailImage を呼び出して生成されるサムネイル画像です。 generateThumbnail メソッドを使用します。

は、その thumbnailImage フィールドは transient であるため、元の image は、オリジナル画像とサムネイル画像の両方を永続化するのではなく、シリアライズされます。これは、シリアライズされたオブジェクトを保存するために必要なストレージが少なくなることを意味します。(もちろん、これはシステムの要件によって望ましい場合もそうでない場合もあります。これは単なる例です)。

デシリアライズ時に readObject メソッドが呼び出され、オブジェクトの状態をシリアライズ時の状態に戻すために必要な処理が実行されます。ここでは、サムネイルを生成する必要があるので readObject メソッドをオーバーライドして、サムネイルを生成するようにします。 generateThumbnail メソッドを使用します。

追加情報については、記事 Java Serialization APIの秘密を探る (これは元々 Sun Developer Network で公開されていたものです) の使用について説明するセクションがあり、そのシナリオでは transient キーワードを使用して、特定のフィールドのシリアライズを防止します。