その時に書きたいものを書きます

その時に書きたいものを書くんです

シリアライズ!!!

オブジェクトのシリアライズについて

参考:

上記リンクを見れば大体わかる。 シリアライズは直列化という日本語役らしい。ちょっとしっくりこないけど間違ってはいない模様。プカプカもやもや浮いてるオブジェクトを、受け渡しやすい一本の直線に整形するみたいなイメージやろか。

とにかくjava.io.Serializableインターフェイスを実装したオブジェクトはシリアライズが可能になる。このインターフェイスは特にメソッドの実装は要求しない(所謂マーカインターフェイス)。

serialVersionUID奴

eclipseでよく見る奴。これはいったい何なのか。
参考:

簡単に言うとシリアル状態からオブジェクトに戻す時の鍵みたいなもの。鍵というか照合するもの。
たとえばネットワーク越しにあるオブジェクトをシリアル化して受け渡すとき、受け渡し元と受け渡し先でそのクラスの構造が同じことが保証できない可能性がある。リリースのズレとかでね。
こういうことが起きた場合に復元しようとすると、InvalidClassExceptionが発生する。これで受け渡し元と先で差異が発生していることを検知することができる。
しかし、例えばあるオブジェクトをシリアライズしてファイルに永続化したとして、その時に指定してあったUIDが例えば123だったとして。その後そのクラスに変数が追加されたりした(なのでUIDも125に改めた)あと、改めてその永続化されたオブジェクトをデシリアライズして取り出そうとする場合。UIDが123と125で差があるので、Exceptionが発生してしまう。こういったことをする場合、たとえクラスに変更があったとしても、UIDは改めるべきではなく、123のままにしておく必要があると思われる。これは永続化したデータと最新のソースの間でオブジェクトの整合性を取ろうとするときに必要な考え方。ちなみにこの時UIDを定義しない(自動生成に任せる)方法をとっておいてしまうと、最初に自動生成されるUIDが843、最後に自動生成されるUIDが234みたいなことになり、やはり整合性が取れない。やはり明示的に123といったUIDをずっとつけておく必要があると思われる。