セッションに保存されるオブジェクトがシリアライズ可能でない | ..:: 仕事メモ ::..

..:: 仕事メモ ::..

プログラミングメモφ(◎。◎‐)フムフムフム

すぐ忘れるのでしょーもないことでもメモします。

内容には環境に依存したものもあるので情報には一切の責任を持ちません・・・



最近は仕事メモすることが少なくなってきたので、日記をマメにメモします

http://www.u-farm.jp/oto/srv_serialize.html


【問題点】
セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったときや、(2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させます。このようなオブジェクトのDisk書き出し処理をシリアライズといいます。 Javaではどんなオブジェクトもシリアライズできるわけではなくて、 java.io.Serializable を実装(implements)したクラスだけが対象となります。

Serializableを実装していないオブジェクトをセッションに保存した場合、最初のうちは問題ないかと思いますが、シリアライズが必要な局面でトラブルを起こします。(通常は NotSerializableException という例外を発生します。)
この問題は開発環境での一過性のテストでは発見しにくく、本番環境で連続稼動しているうちにトラブルの形で初めて発覚することが多いため、十分な注意が必要です。

【対処法】
セッションに保存し得る自作クラスと、そのクラスの中にメンバー変数として含まれる自作クラスを、すべて implements Serializable する。あらかじめ用意されているクラスについては、シリアライズ可能でなければセッションに保存しないよう注意する。

※Javaで用意されている基本的なクラス(String, ArrayList, HashMap等)やStruts の ActionFormクラスはすでに Serializableです。ただし ArrayListのsubList()メソッドから得られるList(ビュー)はシリアライズ不可だったり、いろいろと個別事情がありますのでよく調べて確認の上、対処してください。