2010-05-26 142 views
7

我想要拿起Java並想用Java的客戶端/服務器來測試,以使客戶端將自定義類(Message)的簡單對象發送到服務器。問題是我一直在服務器端得到一個ClassNotFoundException。readobject方法拋出ClassNotFoundException

我認爲其餘的代碼似乎是正常的,因爲其他對象,如字符串可以通過沒有問題。

我有兩個不同的netbeans項目分別在客戶端和服務器的不同位置。

他們每個人都有自己的消息類的副本,在他們各自的包。消息類實現了Serializable。

在客戶端,我試圖通過發送消息對象。

在服務器端,在調用readObject方法時,它似乎是從客戶端的包中找到Message類,而不是它自己的。 printStackTrace顯示:「java.lang.ClassNotFoundException:client.Message」在服務器端

我甚至沒有試圖轉換或存儲收到的對象。有沒有我遺漏的東西?

回答

16

包名和類名必須爲,正好兩邊相同。即寫一次,編譯一次,然後給雙方相同的副本。沒有單獨的server.Messageclient.Message類,但單個shared.Message類或類似的東西。

如果你能保證同一個包/類名,但並非總是如此,只要它是正是同一個副本,那麼您需要添加一個serialVersionUID字段相同的值有問題的類(ES)。

package shared; 

import java.io.Serializable; 

public class Message implements Serializable { 
    private static final long serialVersionUID = 1L; 

    // ... 
} 
+2

請不要讓serialUID正是1L,因爲這可能與具有其他愚蠢的開發商干擾同樣的想法。 – Daniel 2010-05-26 20:12:23

+0

它現在有效!謝謝〜!最後我終於明白了發生了什麼 – eruina 2010-05-27 03:18:32

+0

不客氣。 – BalusC 2010-05-27 11:16:57

4

的原因是,在ObjectInputStream中利用readObject()實際上是實現爲:

String s = readClassName(); 
Class c = Class.forName(s); // Here your code breaks 
Object o = c.newInstance(); 
...populate o... 
相關問題