2017-12-28 1 views
-1

Ich habe ein Objekt aus einer Klasse, die ich nicht ändern kann.Serialisieren Sie ein vorhandenes Java-Objekt mit zirkulären Abhängigkeiten

Das Objekt hat eine kreisförmige Abhängigkeit.

Ich möchte das Objekt serialisieren, aber ich habe keinen Zugriff auf Java-Quellcode, da es in einer Bibliothek ist.

In C++ konnte ich eine Unterklasse erstellen, die virtuellen Methoden überschreiben und dann ablegen, um das gewünschte Verhalten zu erhalten. In Java ist dies nicht möglich.

Welche Möglichkeiten habe ich neben dem Erstellen einer neuen POJO-Klasse und das Kopieren über jedes Feld von Hand?

+0

Also das Objekt ist nicht 'Serializable' nehme ich an. –

+0

Nein, es ist nicht ... –

+0

Sie können Reflektion verwenden und alle Felder rekursiv kopieren, während Sie eine 'IdentityHashMap' zum Auflösen von Zyklen verwenden. Ich bin mir aber sicher, dass jemand es bereits getan hat: https://stackoverflow.com/a/5294224/581205 – maaartinus

Antwort

0

Serialisierung mit Serializable ist ein bisschen stinkend. Ich würde es bevorzugen, einen externen Serialisierer zu verwenden, entweder unter Verwendung von JSON (z. B. Jackson, GSON) oder eines binären Formats (z. B. Kryo). In beiden Fällen können Sie benutzerdefinierte Serializer in all diese schreiben, die Ihre zirkulären Abhängigkeiten auflösen.

+0

Wie lösen Sie zirkuläre Abhängigkeiten auf, ohne die Klasse zu kommentieren? –

+0

Alle von mir aufgeführten Technologien unterstützen externe Serializer, die die Abhängigkeiten extern auflösen. Wie Sie es tun, bleibt Ihnen überlassen, aber Beispiele wären das Serialisieren einer Objektliste als Liste von Objekt-IDs und das erneute Deserialisieren, indem Sie diese Objekte anhand dieser IDs von Ihrer Persistenzschicht laden. –

+0

Haben Sie ein Beispiel? –

0

Ich würde mich für Jackson entscheiden, auch wenn Sie der einzige sein werden, der Ihre Objekte liest/schreibt. Viele Vorteile, bis und einschließlich:

  1. Diagnose/Debugging der serialisierten JSON macht das Leben einfach.
  2. auf diesem ausgetretenen Pfad zu bleiben, heißt Lösungen auf alle Fragen weg ein Google sind, zum Beispiel http://www.baeldung.com/jackson-deserialization
Verwandte Themen