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 $數據。這是不相容的。