Bits of Java (トップ)

VM   JDK と JRE
Language   オブジェクトとインスタンス   this と super   static   フィールドアクセス
IO   Serializable の実装
Swing   MetalLookAndFeel   イメージパネル
JavaBeans   プロパティ名について   XMLEncoder で保存
その他   正規表現テストアプリ   秀丸の強調表示   Ant のインストール   文字セット変換 Ant タスク   XAMPP + Tomcat

Serialization (直列化)

java.io.Serializable インターフェイスは普段のプログラミングであまり意識しない場合が多いと思いますが JavaBeans や EJB を扱うウェブアプリケーションを作成する場合などには Serializable インターフェイスの実装に関する知識は必要だと思います。

Tomcat では再起動やウェブアプリケーションのリロードの際にはセッションの直列化と復元を行っています。 例えば Tomcat 上のあるウェブアプリケーションにブラウザからアクセスしてから Tomcat の再起動を行い、再度同じウェブアプリケーションにアクセスしてもセッションは維持されたままです。 HttpSession インターフェイスは Serializable ではありませんが Tomcat の実装においてはコンクリートクラスでは Serializable が実装されており、緊急時に直列化により保存することが可能なように作られています。 このような機能はおそらくアプリケーションサーバに内蔵されている大抵のサーブレットコンテナが備えている機能だと思います。 しかしこのような機能があってもセッションに格納する属性が正しく Serializable を実装していない場合にはセッションは正しく復元されません。

ウェブアプリケーションにおいてクライアントに関連する情報を JavaBeans であるオブジェクトに保持させ、その JavaBeans をセッションに属性として格納しておくパターンは多いと思います。 しかし JavaBeans が implements 節で Serializable を実装していても正しく設計されていない場合には直列化は失敗してしまいます。 このようなエラーはコンパイル時ではなく直列化を行った時に発生します。 一般にセッションに属性として格納するすべてのオブジェクトは Serializable を正しく実装している必要があると言えると思います。

Serializable インターフェイスに関しては、とりあえずインプリメントしておけば何でも直列化できるようになると思っている方もいるのではないでしょうか。 よく考えずに Serializable インターフェイスを実装しても大抵の場合にはコンパイル時にはエラーになりませんが正しくない実装の場合にはいざ直列化を行おうとする際に例外が発生してしまいます。 ここではそれ程深くつっこんではいませんが最低限必要だと思われる直列化に関する内容について調べてみました。

ここでの記述内容は Java2SDK 1.4 のドキュメントと Java2SDK 1.4.2 上でのテストを基に記述しています。

Contents