とりあえずここまで

今回のコンパイルでコケる問題。
Eclipse 3.3.1の環境でServletのテキストのサンプルコードをコンパイルしたときに
"Serializable class without serialVersionUID"
という警告が出るというものでした。

んでserialVersionUIDについて調べてみると
serialVersionUIDとは、シリアライズ可能なクラス(Serializableインタフェースを実装したクラス)に対して付与するバージョン番号です。
ということらしいです(^-^; ←ちゃんとわかってない

んで対策としては大きく分けると以下の2通りあるようです。

  • 1.serialiVersionUIDを定義する。
  • 2.Eclipse側で該当エラーに対して警告を出さないようにする。

2.の方法としては

  • A.Eclipseのエラー/警告に関する設定を変更する
  • B.classの前に該当エラーを抑制する宣言を追加する。

という2通りあるようです。

A.の設定変更の方法は,Eclipse 3.3.1をPleades 1.2.1b9プラグインを入れた環境の場合,
「ウィンドウ」−「設定」−「コンパイラー」−「エラー/警告」−「潜在的なプログラミングの問題」−「serialVersionUIDなしのシリアライズ可能クラス」の値を「警告」→「無視」に変更する,です。

B.の宣言の追加の方は

@SuppressWarnings("serial")
public class Foo implements java.io.Serializable {}

のようになるようです。
でもなんか気持ち悪いので今回は1.のserialVersionUIDを定義する方を選択しました。

1.のserialVersionUIDの決定方法としては大まかに分けると

  • A.JAVA SDKに含まれているserialver.exeを実行して取得する
  • B.IDEの機能を利用して取得する

という方法があるようです。

A.については本家の↓をご覧下さい(手抜き)
http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/serialver.html

B.については
(1)エラーが発生しているクラス名をクリック

(2)その状態でctrl+'1'を押す。
 そこで表示される選択肢から「生成シリアル・バージョンIDの追加」を選択する。

コンパイル単位が変更されています。シリアルバージョンIDの計算前に保管しますか?」という確認のダイアログが表示されるので「はい」を選択する。
(3)生成されたserialVersionUIDが自動的に追加される。


んでjava SDKの記述に

しかし、デフォルトの serialVersionUID の計算は、クラスの詳細情報に大きく左右され、このクラスの詳細情報はさらに、コンパイラの実装状況に依存しているので、
直列化復元時に予期しない InvalidClassException? が発生する可能性があります。
このような問題を防ぐためにも、すべての直列化可能クラスがserialVersionUID 値を明示的に宣言するように設定することを強くお勧めします。

とあるようなのですが,これはserialVersionUIDを宣言しないと実行時になんらかの規則に従ってserialVersionUIDが計算されて使用されるってことなんでしょうかね?

【参考にしたページ】