街中で見かけて「グッときた人」の思い出

以下の様な警告がでました。

ActionForm.java:
package struts;
import org.apache.struts.action.ActionForm;
public final class AuthenticationForm extends ActionForm
{
private String id;
private String pass;
public void setId(String id) {this.id = id;}
public String getId() {return id;}
public void setPass(String pass) {this.pass = pass;}
public String getPass() {return pass;}
}

# javac -cp ./struts.jar:./servlet-api.jar:. AuthenticationForm.java
----------
1. WARNING in AuthenticationForm.java
(at line 4)
public final class AuthenticationForm extends ActionForm
^^^^^^^^^^^^^^^^^^
The serializable class AuthenticationForm does not declare a static final serialVersionUID field of type long
----------
1 problem (1 warning)
#

警告の意味がわからないのですが
この警告の意味を教えてください。
また、この警告を回避する手段がありましたら教えてください。

A 回答 (2件)

英語そのままですが。


「シリアライズできるクラスはstatic final long serialVersionUIDというフィールドをもたなきゃだめ」
ってことです。
「気にするな」ってのが私の個人的な回答ですが、気になるならば
JDK1.5以上なのであれば、アノテーションで
@SuppressWarnings("serial")
をそのクラスの前に宣言しておけばよろし。
http://www.kawaz.jp/pukiwiki/?Java%20Tips#Suppre …

この回答への補足

ありがとうございます。
Javaのバージョンは1.4.2です。
以下のようにすればエラーはでなくなりましたが
serialVersionUID
は何に使うのでしょうか?


package struts;
import org.apache.struts.action.ActionForm;
public final class AuthenticationForm extends ActionForm
{
static final long serialVersionUID=0;
private String id;
private String pass;
public void setId(String id) {this.id = id;}
public String getId() {return id;}
public void setPass(String pass) {this.pass = pass;}
public String getPass() {return pass;}
}

補足日時:2007/07/06 17:18
    • good
    • 0

>serialVersionUID


>は何に使うのでしょうか?

オブジェクトをシリアライズ化した際に、そのデータを別の環境で復元する時に使うID、だそうです。
オブジェクトを別のマシンなどに送信する際に、オブジェクトをシリアライズ化してそのデータを送信、
受信したマシンでシリアライズ化データを「元のオブジェクト」に復元して利用するのですが、
このとき、「本当に元のオブジェクトなのか」を厳密にしておかないとトラブルになります。
そこで、このIDをあらかじめ決めておいて、IDが復元しても同じならOK、としているようです。

serialVersionUIDが指定されていなくても、IDを持たないわけではなく、自動的に計算して付加されるようです。
クラスの情報とかいろいろ使って、(たぶん)一意に決まるようなものみたいです。
が、環境によってこの計算結果が「異なるかもしれない」らしいのです。
なので、「同じオブジェクトが違う」と言われるかもしれないので、プログラマの方でちゃんとしたものを付けておいてね、
ということのようです。

と、ここまで言ってなんですが、シリアライズ化する必要がなければ全く意味のないものですね。

ちなみに、J2SDKにはserialver.exeというものが付いていて、それで計算できるらしいです。
Eclipse使ってる人はプラグイン入れれば付けられるみたいです。
それ以外では…どうしてるんだろうか。
PED02744さんの回答のように、@SuppressWarningsを使うのが多いのかも。
    • good
    • 0
この回答へのお礼

大変参考になりました。
ありがとうございました。

お礼日時:2007/07/07 13:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報