2006/10/26

[Java]serialize

serializeはJavaでは直列化と訳されている。簡単にいえば、オブジェクトをバイト列に変換する仕組み。逆の操作はデシリアライズになる。バイト列に変換すれば、ファイルに保存したり、DBに格納したり、他のシステムと通信したりできる。

Javaでは、java.io.Serializableをimplementsするだけで、そのオブジェクトはシリアライズ可能になる。(java.io.Externalizableでもいいんだけど、使う機会は少ない)
java.io.ObjectOutputStream#writeObject(Object)に渡して書き出し、java.io.ObjectInputStream#readObject()で読み込む。

具体的な使い方は検索すればいくらでも出てくるので、いくつか注意点。

  • 出力対象のオブジェクト内に格納されたオブジェクトも芋づる式にシリアライズされる。フィールドに設定されたStringとかも一緒に出力されるんだから分かると思うけど。もちろん、自分で作成したクラスを保持していている場合も同じで、全部出力される。
  • 内部に格納されたオブジェクトも、implements Serializableである必要がある。StringやIntegerなど、Javaの標準ライブラリのほとんどがSerializableを実装している。自前のクラスも忘れず実装しておく。
  • implements Serializableしたら、serialiVersionUIDを宣言する。コンパイラの変更やクラスのバージョンアップでデシリアライズできなくなったりすることがある。
  • シリアライズは、オブジェクトの生成を制限するパターンとの相性が悪い。SingletonパターンやTypeSafeEnumパターンでは要注意
  • finalize()メソッドの実装も要注意。副作用があるfinalizeを実装するようなクラスをSerializableにする機会もそんなにないと思うけど。

細かいそれぞれの細かい内容は後で書いとく。

ラベル:

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム