2010-05-26 12 views
7

Ich versuche, Java aufzunehmen und wollte mit Java-Client/Server testen, um den Client ein einfaches Objekt einer selbst definierten Klasse (Message) an den Server zu senden. Das Problem war, dass ich eine ClassNotFoundException auf der Serverseite erhielt.readobject-Methode wirft ClassNotFoundException

Ich denke, der Rest der Codes scheint in Ordnung zu sein, weil andere Objekte wie String problemlos durchlaufen können.

Ich hatte zwei verschiedene Netbeans-Projekte an verschiedenen Standorten für Client und Server.

Jede von ihnen hat ihre eigene Kopie der Nachrichtenklasse unter ihren jeweiligen Paketen. Die Nachrichtenklasse implementiert Serializable.

Auf der Client-Seite versuche ich ein Message-Objekt durch zu senden.

Auf der Serverseite, nach Aufruf der readObject-Methode, scheint es, Nachricht Klasse aus dem Client-Paket statt seiner eigenen zu finden. printStackTrace zeigte: "java.lang.ClassNotFoundException: client.Message" auf der Serverseite

Ich habe nicht einmal versucht, das empfangene Objekt noch zu werfen oder zu speichern. Gibt es etwas, das ich weggelassen habe?

Antwort

16

Der Paketname und Klassenname muss genau das gleiche auf beiden Seiten sein. I.e. einmal schreiben, einmal kompilieren und dann den beiden Seiten die selbe Kopie geben. Keine separaten server.Message und client.Message Klassen, sondern eine einzige shared.Message Klasse oder etwas ähnliches.

Wenn Sie die gleichen Paket/Klassennamen garantieren können, aber nicht immer, wann immer es ist genau die gleiche Kopie, dann müssen Sie ein serialVersionUID Feld mit dem gleichen Wert in die Klasse (n) in Frage hinzuzufügen.

package shared; 

import java.io.Serializable; 

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

    // ... 
} 
+2

Und bitte die serialUID genau 1L nicht machen, weil diese mit anderen dummen Entwickler die mit stören könnten Gleiche Idee. – Daniel

+0

Es funktioniert jetzt! Danke ~ !! Endlich verstehe ich endlich, was los ist – eruina

+0

Gern geschehen. – BalusC

4

Der Grund dafür ist, dass die readObject-() in Object praktisch als implementiert:

String s = readClassName(); 
Class c = Class.forName(s); // Here your code breaks 
Object o = c.newInstance(); 
...populate o... 
Verwandte Themen