【问题标题】:ObjectInputStream readObject(): ClassNotFoundExceptionObjectInputStream readObject(): ClassNotFoundException
【发布时间】:2012-07-29 13:17:20
【问题描述】:

在客户端和服务器类中,我都有一个完全相同的内部类,称为 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 类但找不到它,但我不确定......我该如何解决这个问题?

【问题讨论】:

  • 您似乎有重复的 Data 内部类代码。在客户端,什么类有内部类Data?你在客户端也有 TCPServer 类吗?
  • 向我们展示包含上述代码的客户端类的导入。
  • Data 是 TCPServer.java 和 TCPClient.java 中的一个内部类。 TCPClient.java中发生异常
  • 我认为如果它是 TCPServer 和 TCPClient 中的内部类,那将不起作用。它必须是它自己的类,或者您需要客户端上可用的 TCPServer$Data 类。
  • 谢谢!我现在正在尝试! :)

标签: java tcp classnotfoundexception objectoutputstream objectinputstream


【解决方案1】:

您尝试做的事情大致如下:

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 类。

【讨论】:

  • 谢谢。我假设双方的数据类也必须具有相同的包名?
  • 是的,它们必须是完全相同的类。 “com.test.Data”与“com.abc.Data”不同,即使两个文件中的代码相同。
  • @Jyro117 你的一个班轮刚刚结束了我 2 小时的寻找答案,谢谢!
  • 我实际上只是想弄清楚为什么 ClassNotFoundException 甚至存在,因为您必须在反序列化后向下转换为正确的类型。了解您在此处解释的内容使这种行为变得有意义!我不知道整个层次结构必须匹配——但现在想想,这很有意义。有必要真正确保反序列化的对象是真正的同一个类。
【解决方案2】:

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

您要做的是编组 TCPServer$Data 并解组为 TCPClient$Data。这是不兼容的。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多