Java ObjectInputStream readObject():ClassNotFoundException

Java ObjectInputStream readObject():ClassNotFoundException,java,tcp,classnotfoundexception,objectoutputstream,objectinputstream,Java,Tcp,Classnotfoundexception,Objectoutputstream,Objectinputstream,在客户机类和服务器类中,我有一个完全相同的内部类,称为Data。正在使用以下方式从服务器发送此数据对象: ObjectOutputStream output= new ObjectOutputStream(socket.getOutputStream()); output.writeObject(d); (其中d是数据对象) 此对象在客户端接收并强制转换为数据对象: ObjectInputStream input = new ObjectInputStream(socket.getInputS

在客户机类和服务器类中,我有一个完全相同的内部类,称为Data。正在使用以下方式从服务器发送此数据对象:

ObjectOutputStream output= new ObjectOutputStream(socket.getOutputStream());
output.writeObject(d);
(其中d是数据对象)

此对象在客户端接收并强制转换为数据对象:

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()


我的猜测是,它试图在服务器端查找数据类,但找不到,但我不确定。。。如何解决此问题?

当您在两个不同的JVM中使用某个类,并且正在编组/解编组该类时,该类应导出到公共库,并在服务器和客户端之间共享。不同的课程在任何时候都不起作用


您试图做的是整理TCPServer$数据,并将其解组为TCPClient$数据。这是不兼容的。

您试图做的是以下几点:

class TCPServer {
    /* some code */

    class Data {

    }
}

class TCPClient {
    /* some code */

    class Data {

    }
}
然后序列化TCPServer$数据并尝试将其作为TCPClient$数据取消序列化。相反,您将希望这样做:

class TCPServer {
    /* some code */

}

class TCPClient {
    /* some code */

}

class Data {
    /* some code */

}

然后确保数据类对客户端和服务器程序都可用。

看起来您有重复的数据内部类代码。在客户端,什么类具有内部类数据?客户端是否也有TCPServer类?向我们展示包含上述代码的客户端类的导入。Data是TCPServer.java和TCPClient.java中的一个内部类。异常发生在TCPClient.javaI中,我认为如果它是TCPServer和TCPClient中的一个内部类,那么它将不起作用。它必须是它自己的类,否则您需要在客户端上提供TCPServer$数据类。谢谢!我现在正在尝试!:)非常感谢。我假设两边的数据类也必须具有相同的包名?是的,它们必须是完全相同的类。“com.test.Data”与“com.abc.Data”不同,即使两个文件中的代码相同。@Jyro117您的一行代码刚刚结束了我2小时的搜索,以获得答案,谢谢!实际上,我只是想弄清楚为什么ClassNotFoundException甚至存在,因为在反序列化之后必须向下转换到正确的类型。知道你在这里解释了什么,这种行为才有意义!我不知道整个层次结构必须匹配——但现在想想,这很有道理。必须确保反序列化的对象确实是同一个类。