0

非静的内部クラスをシリアル化することは可能ですか?

はいの場合、良い例を提供できますか。

私はいくつかのブログやサイトをグーグルで検索しましたが、答えがないので私は納得しました。

編集: 最終的なstaic変数を持つ内部クラスはどうですか。

4

1 に答える 1

8

内部クラスには外部クラスへの暗黙の参照が含まれているため、内部クラスをシリアル化するには、その外部クラスも同様である必要があります。

正確にドキュメントから:

ローカルクラスや匿名クラスを含む内部クラス(つまり、静的メンバークラスではないネストされたクラス)のシリアル化は、いくつかの理由から強く推奨されていません。非静的コンテキストで宣言された内部クラスには、クラスインスタンスを囲む暗黙の非一時的な参照が含まれているため、そのような内部クラスインスタンスをシリアル化すると、関連する外部クラスインスタンスもシリアル化されます。内部クラスを実装するためにjavac(または他のJavaTMコンパイラ)によって生成される合成フィールドは実装に依存し、コンパイラによって異なる場合があります。このようなフィールドの違いにより、互換性が損なわれるだけでなく、デフォルトのserialVersionUID値が競合する可能性があります。ローカルおよび匿名の内部クラスに割り当てられた名前も実装に依存し、コンパイラ間で異なる場合があります。内部クラスはコンパイル時定数フィールド以外の静的メンバーを宣言できないため、serialPersistentFieldsメカニズムを使用してシリアル化可能なフィールドを指定することはできません。最後に、外部インスタンスに関連付けられた内部クラスには引数ゼロのコンストラクターがないため(このような内部クラスのコンストラクターは、包含インスタンスを付加パラメーターとして暗黙的に受け入れます)、Externalizableを実装できません。ただし、上記の問題はいずれも静的メンバークラスには当てはまりません。外部インスタンスに関連付けられた内部クラスには引数ゼロのコンストラクターがないため(このような内部クラスのコンストラクターは、包含インスタンスを付加パラメーターとして暗黙的に受け入れます)、Externalizableを実装できません。ただし、上記の問題はいずれも静的メンバークラスには当てはまりません。外部インスタンスに関連付けられた内部クラスには引数ゼロのコンストラクターがないため(このような内部クラスのコンストラクターは、包含インスタンスを付加パラメーターとして暗黙的に受け入れます)、Externalizableを実装できません。ただし、上記の問題はいずれも静的メンバークラスには当てはまりません。

それで

非静的コンテキストで宣言された内部クラスには、クラスインスタンスを囲む暗黙の非一時的な参照が含まれているため、そのような内部クラスインスタンスをシリアル化すると、関連する外部クラスインスタンスもシリアル化されます。

ソース

于 2012-05-29T10:59:50.080 に答える