LoginSignup
1
1

More than 1 year has passed since last update.

JavaのSerializableに対する自分の理解

Posted at

そもそも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の実装例

以下が参考になった

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1