- PR -

RMIでのUnmarshalExceptionについて

1
投稿者投稿内容
SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-06-02 11:01
現在SolarisのWebSphere上にあがっているアプリケーションに
RMIを使ってアクセスしようとしているのですが、
ava.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.InvalidClassException: クラス名; Local class not compatible: stream classdesc serialVersionUID=227490017397618357 local class serialVersionUID=-4630694670778761550
java.io.InvalidClassException: クラス名; Local class not compatible: stream classdesc serialVersionUID=227490017397618357 local class serialVersionUID=-4630694670778761550
というエラーが出てしまいます。
おそらく、serialVersionUIDが違うと怒られているのだと思うのですが、
なぜそのようなことが起こるのでしょうか?
他のサイトで通信しているマシン間で、1台がHotSpotあり、
もう1台がHotSpotなしだったため、両方HotSpotなしにしたら
エラーが回避された、という書き込みを見つけました。
ただ、私の環境では2台ともHotSpotありでした。
状況としては、レジストリを取得して、
サーバー上のRMIオブジェクトの取得まではできています。
その後、メソッドを呼び出そうとすると、上記のエラーが発生します。
すみません、どなたか回避方法をご存知の方いらっしゃいましたら、ご教授願います。

環境
マシン1
OS:Solaris9
Java:
java version "1.4.0_00"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_00-b05)
Java HotSpot(TM) Client VM (build 1.4.0_00-b05, mixed mode)


マシン2
OS:Windows XP
Java:
java version "1.4.2_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05)
Java HotSpot(TM) Client VM (build 1.4.2_07-b05, mixed mode)
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 11:12
引数や戻り値のオブジェクトのクラスのバージョンが違う、と言われてるのだと思います。
クライアントとサーバでクラスファイルは同じものを使っていますか?
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-06-02 13:27
原因はukさんご指摘の通り、RMIサーバとクライアントが、
異なるバージョンのクラスファイルを使用しているからだと思います。

異なるバージョンとは、serialVersionUIDが違う、と言う意味で、
JVMが内部的に振っているバージョンです。
また、このserialVersionUIDは、privateでないメンバを追加・変更...
定数を追加した、メソッドのシグネチャを変えた...等
した際に値が変わるようです。

対策としては、サーバとクライアントでクラスファイルの同期を取るようにするか、
クラス中に
 private static final long serialVersionUID = xxxx;
のように明示的にバージョンを付けてやる方法があります。

参考 http://java.sun.com/j2se/1.4/ja/docs/ja/guide/serialization/spec/class.doc6.html

SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-06-02 14:26
ukさん、YOU@ITさん
ご返信ありがとうございました。
ご指摘のとおり、ソースのバージョンが違いました。。。。
それで、ソースを入れ替えて試してみたのですが、
今度はNullPointerExceptionが発生し、
test_Stub.getTest(Unknown Source)
となってしまいました。
クライアント側にrmicにて、test_Stubを作成し、
クラスパスの通っている場所におきました。
test_Stubというのは、あくまでRMI通信をするためのtestクラス(元)
のスタブですよね?
とすると、getTestも存在するはずなのに、なぜNullPointerExceptionが発生してしまうのでしょうか・・・?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 17:02
NullPointerExceptionはヌルポインタへのアクセスが発生したことを
示す例外ですよ。
クラス解決が出来ない場合やメソッド解決が出来ない場合は別の例外が
飛ぶので、その解釈は違っていますよ。


SUNNYDAY
常連さん
会議室デビュー日: 2004/07/14
投稿数: 49
投稿日時: 2005-06-07 16:18
シュンさんご回答ありがとうございました。
すみません、昨日回答したと思っていたのですが、
うまく送信できていなかったみたいです。
返信遅くなってすいません。
基本的にNullPointerExceptionの発生継起の解釈が違ったみたいですね・・・。
すみません、ご指摘ありがとうございました。
表題のエラーは、サーバーのクラスをローカルにダウンロード等して、
なんとか解決しました。
ご回答くださったみなさま、ありがとうございました。m(_ _)m
1

スキルアップ/キャリアアップ(JOB@IT)