そもそもSerializableとは
javadoc↓
https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html
java.io.Serializable
がimplementされたクラスは、serialize(=直列化)できる。
serializeとは、具体的にはバイト配列化させるということ。
バイト化させることで、クラスのデータをストリーム(ファイル)やディスクに読み書きできるようになるため、低レイヤでのデータやりとりが可能になる。
おもにdtoやformクラスにimplementすることが多い。
Serializableをimplementしないことによって起きる害
sessionにdtoを詰める際は、dtoが直列化可能である必要がある。
(=Serializableをimplementしている必要がある)
HttpSessionオブジェクトは、コンテナへ特に設定しない場合はメモリに格納されたままなので特にシリアライズは不要ですが、JavaEEの仕様としてHttpSessionに格納されるオブジェクトは複数コンテナ間に永続可能にできるよう、単一コンテナのメモリ以外へオブジェクトを共有できる仕様があり(HttpSession persistence)、以下のいくつかが選択できます(コンテナによってはこれ以外にも機能があります)
- ファイルへ読み書きする
- JDBC経由でデータベースを使う
- クラスタリング
- キャッシュサーバ(redisなど)
つまりWebアプリケーションが動作しているJVMから全く別の場所にオブジェクトを送受信できるようにしてるため、シリアライスが必須です。
セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったときや、(2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させます。
このようなオブジェクトのDisk書き出し処理をシリアライズといいます。 Javaではどんなオブジェクトもシリアライズできるわけではなくて、 java.io.Serializable を実装(implements)したクラスだけが対象となります。
Serializableの実装例
以下が参考になった