2012-04-09 14 views
12

Javaで静的内部クラスをシリアル化できますか?クラス自体はここでは静的として宣言されています。静的内部クラスのシリアライズ

+12

さて、あなたが...試してみるとどうなりますか? –

+1

これを行うと、私のアプリケーションが正常に動作しています。しかし、これが起こるために、私は内部クラスと外部クラスの両方を直列化していますが、これは私にとっては必要ではありませんが、内部クラスが直列化されていて、外部が直列化されなければならないという概念を知っています。また、私は静的クラスのいくつかの疑問をシリアル化することができるかどうかを持っています。 – Tinkerbel

+0

外部クラスは_static_内部クラスの直列化とは何の関係もありません。 –

答えて

18

静的内部クラスは、この点でトップレベルクラスと違いはありません:Serializable(又はSerializableを実装するために宣言されたクラスのサブクラスである)を実装するために宣言されている場合には、シリアル化することができます。また、最上位クラスの場合と同様に、実行時に直列化中に発生するすべてのオブジェクトは、NotSerializableExceptionを避けるために直列化可能でなければなりません。内部クラスはstaticなので、外部クラスの性質はこれとは無関係です。

+1

ありがとう皆さん。私はあなたから必要なものを得ました。 – Tinkerbel

0

現在、Javaのバージョンによって答えが異なるようです。

JDK 7の直列化仕様は言う:

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

とOracleとIBM JDK 1.7バージョンの間でオブジェクトをシリアル化する経験から、私はそれがいつもうまくいくとは言えません。私は常にそれが常に失敗すると言うことはできませんが、あなたは確かにそれを期待することはできません。

私のアプリケーションで失敗していないコードパスは、JDK 1.5で5年間、正常に動作していましたが、現在のステートメントに似たシリアル化に関する以前のドキュメントには何も表示されません。だから、Java神々は7

+3

これは** static ** innerクラスを指定する質問には関係ありません。 – gerardw

1

@Tinkerbelの何かが注意すべきJDKでこのコードパターン許可されているようだ - 静的な入れ子になったクラスをシリアル化

が細かいですが、を (将来的に)静的内部クラスは、これまでであればとき別の外部クラスに移動し、古いオブジェクトを直列化することは問題である。

すべてのフィールドは、デフォルト/ nullに割り当てられています。

+0

誰かがなぜその理由を説明できれば助けになるでしょうか?パッケージが変更されるたびにこれが起こるべきようですね...私はそれを観察してきたが、私は非常に説得力のある理由を持っていません – user2674407

関連する問題