Java プログラムで非静的内部クラスをシリアライズしたいと考えています。これは許可されていませんが、内部クラス (デフォルト) には外部クラス (この場合はシリアル化できない) への参照があるため、シリアル化しようとすると、外部クラスに対して NullPointerException が発生します。
では、外部クラスへの参照をオーバーライドして一時的に設定し、内部クラスのオブジェクトが作成されるたびに初期化されてシリアル化されないようにする方法はありますか?
Java プログラムで非静的内部クラスをシリアライズしたいと考えています。これは許可されていませんが、内部クラス (デフォルト) には外部クラス (この場合はシリアル化できない) への参照があるため、シリアル化しようとすると、外部クラスに対して NullPointerException が発生します。
では、外部クラスへの参照をオーバーライドして一時的に設定し、内部クラスのオブジェクトが作成されるたびに初期化されてシリアル化されないようにする方法はありますか?
囲んでいるインスタンスへの暗黙の参照を作成することはtransient
できませんが、ネストされた(静的)クラスにするように再設計し、コンストラクター引数で囲んでいるインスタンスを明示的に渡すことができます。次に、ネストされたクラスに明示的な変数が必要になります。これには、としてタグを付けることができますtransient
。
できません: 内部クラスが でない場合static
、その初期化状態は、定義により外部クラスのインスタンスに依存します。これは、最初に外側のクラスのインスタンスがなければ、内側のクラスのインスタンスを取得できないためです。
また、外側のクラスは ではないため、外側のクラスSerializable
のインスタンスをシリアル化することはできません。したがって、内側のクラスのインスタンスをシリアル化することはできません。
または、内部クラスを静的にして、それで完了です...
自動化されたシリアル化にはいくつかのマイナス面があります。フィールド名を変更したり、フィールドの可視性を変更したりすると、逆シリアル化が機能しなくなります。さらに、「自動的に」保存されるオブジェクトのスペースがさらに必要になります。このため、ほとんどの場合、クラスを手動でシリアライズ/デシリアライズしています: int を書き、文字列を書き戻すのではなく、文字列を読み戻します。このメソッドを使用すると、必要に応じて非静的内部クラスのデシリアライゼーションを作成できます