2012-03-26 4 views
2

Ich hatte als Plan eine Schnittstelle I zu definieren, die von vielen Objekten geteilt werden würde, die von einem Server von mir zu einem Client serialisiert werden würden. Die Idee wäre, dass der Client nur die Schnittstelle kennt und sich nie darum kümmern muss, irgendeine der konkreten Implementierungen von I zu kennen.Muss mein Projekt den konkreten Typ einer Klasse kennen, die ich deserialize bin?

Das Problem scheint zu sein, dass dies nicht möglich zu sein scheint, da Java beim Deserialisieren die Klasse finden muss, die ich in seinem Klassenpfad deserialisieren möchte.

Irgendwelche Alternativen?

Antwort

1

Woher sollte die VM des Clients den Bytecode für die Implementierungen erhalten? Wenn Sie nicht anfangen wollen, die konkreten Implementierungsklassen über den Draht zu schicken, wird dieser Ansatz einfach nicht funktionieren. Der Kunde wird die konkreten Implementierungen benötigen.

4

Ja, der Client benötigt die konkreten Implementierungen in seinem Klassenpfad. Im Allgemeinen ist es am einfachsten, alle Implementierungen in die Client-Jars aufzunehmen. In einigen Extremsituationen kann es sinnvoll sein, die Implementierungen im laufenden Betrieb ladbar zu machen. In diesem Fall können Sie die Remote-Classloading-Funktion von rmi verwenden (beachten Sie, dass dies im Allgemeinen sehr schwierig ist und sich nicht lohnt).

0

Dies kommt sehr darauf an, was die Klasse in der Art der Funktionalität implementieren muss.

Wenn Ihre Klasse nichts anderes als eine Bean mit Daten ist, dann könnte Ihr Client-Code auf ASM und andere Techniken der dynamischen Laufzeit-Byte-Code-Manipulation zugreifen. Ein gutes Beispiel, das ich kürzlich benutzte, war Jacksons Mr. Bean. Es benötigt nur eine sehr einfache Schnittstelle, um ganze Bohnen im laufenden Betrieb zu erstellen.

Wenn Sie tatsächliche Funktionalität in Ihrer Klasse haben müssen und diese Funktionalität ist nicht im Client, dann würde ich erwarten, dass Sie in Serialisierung einer Klasse suchen würde, senden Sie es auf den Draht und dann wahrscheinlich eine Art von Gewohnheit Klassenlader, der eine Klasse aus den deserialisierten Daten laden kann.

Verwandte Themen