3

クライアント クラスとサーバー クラスの両方に、Data というまったく同じ内部クラスがあります。この Data オブジェクトは、以下を使用してサーバーから送信されています。

ObjectOutputStream output= new ObjectOutputStream(socket.getOutputStream());
output.writeObject(d);

(d はデータ オブジェクト)

このオブジェクトはクライアント側で受信され、Data オブジェクトにキャストされます。

ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object receiveObject = input.readObject();
if (receiveObject instanceof Data){
    Data receiveData = (Data) receiveObject;
    // some code here... 
}

私はjava.lang.ClassNotFoundException: TCPServer$Dataこの行にObject receiveObject = input.readObject();

私の推測では、サーバー側で Data クラスを検索しようとしていて見つからないのですが、よくわかりません... どうすれば修正できますか?

4

2 に答える 2

8

あなたがやろうとしていたのは、次のようなものです。

class TCPServer {
    /* some code */

    class Data {

    }
}

class TCPClient {
    /* some code */

    class Data {

    }
}

次に、TCPServer$Data をシリアル化し、それを TCPClient$Data としてシリアル化解除しようとしています。代わりに、これをやりたいと思うでしょう:

class TCPServer {
    /* some code */

}

class TCPClient {
    /* some code */

}

class Data {
    /* some code */

}

次に、Data クラスがクライアント プログラムとサーバー プログラムの両方で使用できることを確認します。

于 2012-07-31T17:59:47.350 に答える
3

2 つの異なる JVM でクラスを使用し、そのクラスをマーシャリング/アンマーシャリングする場合、そのクラスを共通ライブラリにエクスポートし、サーバーとクライアントの両方で共有する必要があります。別のクラスを持つことは、いつでも機能しません。

あなたがやろうとしているのは、TCPServer$Data をマーシャリングし、TCPClient$Data としてアンマーシャリングすることです。それは互換性がありません。

于 2012-07-31T17:49:54.143 に答える