2009-07-31 15 views
6

今朝私の上司と私は、Webアプリケーションのパフォーマンスの問題を診断しようとする中で、長いこと、そして最終的に無益な議論がありました。私たちは本当に結論には至りませんでした。Javaの静的でない内部クラスとシリアライゼーションの問題

シリアライズ可能な非静的内部クラスに問題があると思うのは当然だと思いますが、問題が何であるか正確に避けるべきか正確ではありません(は常にそれを避ける)。誰もこの問題に苦しんでいないためのガイドラインを提案することはできますか?

+2

あなたは本当に問題は、あなたが遭遇したことが何であるかを明確にする必要があります。クラスはシリアライズ可能であるかどうかは問題ではありません。問題はあなたがそれらを使って何をしているかです。あなたのアプリケーションをプロファイルしましたか?メインホールドアップはどこですか? – ChssPly76

答えて

7

内部クラスはその外部クラスへの参照を保持しているため、内部をシリアル化しようとすると外部が保持するかもしれない他のオブジェクトも直列化します。これは、巨大なオブジェクトグラフになる可能性があります。また、外部にシリアル化できない状態(InputStreamオブジェクトなど)がある場合は、失敗する可能性があります。

しかし、内部クラスを直列化する必要がある場合は、直列化を計画していない場合でもそうです。たとえば、Swingで作業している場合です。

これらのオブジェクトをシリアル化する予定がある場合は、パフォーマンスに関係なく内部クラスにする必要がある理由について質問します。一般的に、データコンテナとそのようなコンテナは、(もしかすると)ある種の "親"クラスへの参照を必要とすることはめったにありません。これらのオブジェクトを内部クラスではなくネスト(静的)クラスにすることを検討してください。

3

シリアル化された内部クラスには、そのオブジェクトを含む暗黙的な参照があることだけが分かります。 transient

  • 外側のクラスが外部クラスを自動的に内部で直列化さ
  • シリアライズ可能である必要があり、それができないように、参照が自動的に生成され

    • :その参照は意味の数を持っていクラス
    • 外側のオブジェクトは、おそらく私は浚渫することができます主なガイドラインは、内部クラスの元をシリアル化していない」で、その内のオブジェクト

    から分離することはできません彼らの入っている物体からは止める」私はそれ以上のことを考えることはできません。

  • 0

    考えました。あなたの外部クラスに内部クラスのインスタンスの(非一時的な)コレクションが含まれている場合、内部クラスインスタンスの1つをシリアル化するたびに、それらをすべて直列化に引き出します。

    +0

    Javaシリアル化メカニズムは、オブジェクトがすでにストリームに書き込まれたことを知り、そのオブジェクトへの後続の参照がIDを使用することを知るのに十分です。これにより、オブジェクトグラフを再構築し、グラフ内でIDを保持することができます。 – kdgregory

    関連する問題