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

当您在两个不同的 JVM 中使用某个类并且正在编组/解组该类时,应将该类导出到一个公共库并在服务器和客户端之间共享。任何时候都有不同的班级是行不通的。

您要做的是编组 TCPServer$Data 并将其解组为 TCPClient$Data。那是不相容的。

于 2012-07-31T17:49:54.143 回答