ObjectInputStream readObject():ClassNotFoundException

时间:2012-07-31 17:29:24

标签: java tcp classnotfoundexception objectoutputstream objectinputstream

在客户端和服务器类中,我都有一个名为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类而无法找到它,但我不确定......我该如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

您尝试做的事情如下:

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类可用于客户端和服务器程序。

答案 1 :(得分:3)

当您在两个不同的JVM中使用某个类,并且您正在编组/解组该类时,该类应该导出到公共库并在服务器和客户端之间共享。不同的班级不会随时工作。

您要做的是将TCPServer $ Data和unmarshall编组为TCPClient $ Data。这是不相容的。