Vermeidung von doppelten Objekten in der Java-Deserialisierung

8

Ich habe zwei Listen (list1 und list2), die Verweise auf einige Objekte enthalten, wobei einige der Listeneinträge auf dasselbe Objekt zeigen können. Aus verschiedenen Gründen serialisiere ich diese Listen dann in zwei separate Dateien. Schließlich, wenn ich die Listen deserialize, würde ich gerne sicherstellen, dass ich nicht mehr Objekte neu erstellen als benötigt. Mit anderen Worten, es sollte immer noch möglich sein, dass ein Eintrag von List1 auf dasselbe Objekt wie ein Eintrag in List2 zeigt.

%Vor%

Ich denke, dass Abschnitt 3.4 und A.2 der spec sagen, dass Deserialisierung strikt zur Schaffung neuer Objekte führt, aber ich bin mir nicht sicher. Wenn ja, könnten einige mögliche Lösungen beinhalten:

  1. Implementierung von equals () und hashCode () und Referenzen manuell überprüfen.
  2. Erstellen einer "Container-Klasse", die alles enthält und dann die Container-Klasse serialisiert.

Gibt es eine einfache Möglichkeit sicherzustellen, dass Objekte bei der Deserialisierung nicht dupliziert werden?

Danke.

    
YGL 19.04.2010, 06:37
quelle

3 Antworten

4

Nach der Deserialisierung der zweiten Liste können Sie die Elemente durchlaufen und Duplikate durch einen Verweis auf die erste Liste ersetzen.

Nach 3.7 Die readResolve-Methode the readResolve() Methode wird nicht für das Objekt aufgerufen, bis das Objekt vollständig erstellt ist.

    
stacker 19.04.2010, 06:54
quelle
3
  

Ich denke, dass die Abschnitte 3.4 und A.2 der Spezifikation sagen, dass die Deserialisierung ausschließlich zur Erzeugung neuer Objekte führt, aber ich bin mir nicht sicher. Wenn ja, könnten einige mögliche Lösungen beinhalten: ...

     
    

2, Erstellen einer "Container-Klasse", die alles enthält und dann die Container-Klasse serialisiert.

  

Ich lese diese Anweisungen als "Wenn ich verstehe, dass die Deserialisierung immer neue Objekte erzeugt, dann ist die Lösung # 2, beide Listen in eine Containerklasse zu schreiben, eine akzeptable Lösung."

Wenn ich Sie richtig verstehe, bedeutet das, dass Sie denken, dass das Schreiben durch einen einzelnen Container, der beide Listen enthält, nicht funktioniert, weil es immer noch zu doppelten Objekten führt ("ergibt strenggenommen ... neue Objekte"). Das ist falsch. Wenn Sie das Diagramm der Objekte (Ihre Wrapper-Klasse) aufschreiben, wird jedes Objekt nur einmal serialisiert, unabhängig davon, wie viele Vorkommen im Diagramm vorhanden sind. Wenn das Diagramm wieder eingelesen wird, wird dieses Objekt nicht dupliziert.

Ссылка

  

Der Standard-Serialisierungsmechanismus für ein Objekt schreibt die Klasse des Objekts, die Klassensignatur und die Werte aller nicht-flüchtigen und nicht-statischen Felder. Verweise auf andere Objekte (außer in transienten oder statischen Feldern) bewirken, dass diese Objekte auch geschrieben werden. Mehrere Verweise auf ein einzelnes Objekt werden mithilfe eines Verweisfreigabemechanismus codiert, sodass Grafiken von Objekten in derselben Form wiederhergestellt werden können wie beim Schreiben des Originals.

Wenn Sie können, verwenden Sie Option 2.

  

Erstellen einer "Container-Klasse", um alles zu halten und dann die Container-Klasse zu serialisieren.

    
Bert F 19.04.2010 07:27
quelle
2

Sie können die readResolve() -Methode überschreiben, um zu ersetzen, was aus dem Stream gelesen wird, mit allem, was Sie möchten.

%Vor%

Dies wird normalerweise zum Erzwingen von Singletons verwendet. Vor Java 5 wurde es auch für typsichere Enums verwendet. Ich habe nie gesehen, dass es für dieses Szenario verwendet wurde, aber ich denke, es gibt keinen Grund, warum es nicht sein könnte.

Nun wird das mit einzelnen Objekten funktionieren, die du kontrollierst, aber ich kann nicht sehen, wie du es mit einem List machen würdest. Es könnte sicherstellen, dass die Objekte, die in dieser Liste zurückgegeben werden, nicht dupliziert werden (nach welchen Kriterien auch immer).

    
cletus 19.04.2010 06:42
quelle

Tags und Links