9

私は Java を取り上げようとしていて、Java のクライアント/サーバーをテストして、クライアントが自己定義クラス (メッセージ) の単純なオブジェクトをサーバーに送信するようにしたいと考えていました。問題は、サーバー側で ClassNotFoundException を取得し続けたことです。

String などの他のオブジェクトは問題なく通過できるため、残りのコードは問題ないように思われます。

クライアントとサーバーごとに異なる場所に2つの異なるnetbeansプロジェクトがありました。

それぞれのパッケージの下に Message クラスの独自のコピーがあります。Message クラスは Serializable を実装しています。

クライアント側では、Message オブジェクトを送信しようとしています。

サーバー側では、 readObject メソッドを呼び出すと、独自のパッケージではなく、クライアントのパッケージから Message クラスを見つけているようです。printStackTrace が示した: サーバー側で「java.lang.ClassNotFoundException: client.Message」

受け取ったオブジェクトをキャストまたは保存しようとさえしていません。私が忘れたものはありますか?

4

2 に答える 2

21

パッケージ名とクラス名は両側で完全に同じでなければなりません。つまり、1 回書き込み、1 回コンパイルしてから、両側に同じコピーを渡します。server.Message個別のクラスとクラスはありませんclient.Messageが、単一のshared.Messageクラスまたはそのようなものはありません。

同じパッケージ/クラス名を保証できるが、常に正確serialVersionUIDに同じコピーであるとは限らない場合は、問題のクラスに同じ値を持つフィールドを追加する必要があります。

package shared;

import java.io.Serializable;

public class Message implements Serializable {
    private static final long serialVersionUID = 1L;

    // ...
}
于 2010-05-26T19:33:56.667 に答える
4

その理由は、ObjectInputStream の readObject() が実際には次のように実装されているためです。

 String s = readClassName();
 Class c = Class.forName(s); // Here your code breaks
 Object o = c.newInstance();
 ...populate o...
于 2010-05-26T20:14:29.523 に答える