3

在客户端和服务器类中,我都有一个完全相同的名为Data的内部类。此数据对象被从服务器使用发送:ObjectInputStream readObject():ClassNotFoundException

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$DataObject receiveObject = input.readObject();

我的猜测是,它试图寻找在服务器端的数据类,并不能找到它,但我不知道...我如何解决这个问题?

+2

看来你有重复的数据内部类的代码。在客户端,什么类有内部类数据?客户端是否也有TCPServer课程? – devang 2012-07-31 17:36:09

+1

向我们展示包含上述代码的客户端类的导入。 – 2012-07-31 17:38:53

+0

数据是TCPServer.java和TCPClient.java中的内部类。 在TCPClient.java中发生异常 – 2012-07-31 17:42:28

回答

7

什么你想要做的是沿着以下线的东西:

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 */ 

} 

然后确保数据类是提供给客户端和服务器程序都。

+0

谢谢。 我假设两边的Data类都必须具有相同的包名称? – 2012-07-31 18:15:55

+2

是的,他们需要完全一样的课程。即使两个文件中的代码都是相同的,“com.test.Data”与“com.abc.Data”不同。 – Jyro117 2012-07-31 18:18:30

+0

@ Jyro117你的一个班轮刚刚结束了我的2小时搜索答案,谢谢! – 2013-10-27 07:02:26

3

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

你在做什么是marshall TCPServer $数据和unmarshall作为TCPClient $数据。这是不相容的。

相关问题