2016-07-30 24 views
1

Ich habe einen Client und einen Server, die Serialisierung verwenden, um ein Array Shape von Server zu Client zu senden. Ich habe den ganzen Code geschrieben, und es gibt keinen Fehler darin, ein geteiltes Paket zwischen dem Client-Programm und dem Server-Programm zu erstellen. Allerdings, wenn ich zwei separate Projekte erstellen und für jedes, wenn die Projekte, die ich Shape.java mit dem gleichen Inhalt wie das andere habe, aber dieses Mal, als ich Client zum Server verbinde, gibt es mir eine ClassNotFoundException. Warum auf der Erde gibt es keinen Fehler, wenn ich Shape.java in einem freigegebenen Paket, aber sobald ich eine Kopie erstellen und fügen Sie diese auf Server-Programm, gibt es mir ClassNotFoundException? Ich brauche das wirklich, weil ich meinen Code an meinen Freund senden möchte, und er hat ein separates Projekt, das dieses serialisierte Objekt verwendet.Warum wird die Definition der Serialisierung von Klassen in einem gemeinsam genutzten Paket nicht zu einer `ClassNotFoundException`?

+0

Wahrscheinlich, weil Sie es nicht im selben Paket erstellen. –

+0

Ja, das ist meine Frage, warum sollte ich es im selben Paket erstellen, auch wenn ich die Definition von 'Shape' in das Zielprojekt lege? –

+0

Das gleiche Paket wie in 'foo.bar.baz.Shape'. –

Antwort

1

Warum sollte ich [die Klasse] im selben Paket erstellen?

Da Shape ist nicht der Name der Klasse, nur ein Teil davon. Java identifiziert Klassen nach ihrem vollständigen Namen, einschließlich Paket. Wenn Sie Shape auf dem Server als com.myserver.Shape und auf dem Client als com.myclient.Shape definieren, behandelt JVM die beiden Klassen korrekt als nicht verwandt.

Ein gängiger Ansatz besteht darin, ein spezielles Paket für Ihre Datenaustauschobjekte zu erstellen, z. com.shared.dto.Shape, und verwenden Sie es auf beiden Seiten der Kommunikation.

Wenn Sie Ihr Projekt mit jemand anderem teilen müssen, erstellen Sie ein separates Glas mit Ihren DTOs und ein anderes Glas mit der Client-Bibliothek. Erstellen Sie den Client-Code mit der Client-Bibliothek und dem DTO-Jar. Dadurch wird sichergestellt, dass der Client mit dem Server kommunizieren kann, der für dasselbe DTO-Jar erstellt wurde.

+0

Danke für den Hinweis, wenn er den Namen seines Pakets zu etwas wie meinem macht, würde der Fehler behoben werden? –

+0

@ehsan Ja, wenn Sie den gleichen Paketnamen auf beiden Seiten verwenden, wird der Fehler behoben. Es ist jedoch besser, die gleiche Datei zu verwenden, um Probleme zu vermeiden, die dadurch verursacht werden, dass die eine Seite modifiziert wird, aber nicht die andere.Es ist eine gute Idee, auch die Versionsnummer Ihrer Klassenserialisierung anzugeben. – dasblinkenlight

+0

Danke, und ich habe hinzugefügt: 'private statische final long serialVersionUID = 20L;', und vergib mir, meine Abstimmung ist gesperrt, da ich viel upvote;) –