Java verfolgt die Objekte, die in den Stream geschrieben wurden, und nachfolgende Instanzen werden als ID und nicht als tatsächlich serialisiertes Objekt geschrieben.
Wenn Sie also in Ihrem Beispiel die Instanz "a" in den Stream schreiben, gibt der Stream diesem Objekt eine eindeutige ID (sagen wir "1"). Im Rahmen der Serialisierung von "a" müssen Sie "b" serialisieren, und der Stream gibt ihm eine andere ID ("2"). Wenn Sie dann "b" in den Stream schreiben, wird nur die ID und nicht das eigentliche Objekt geschrieben.
Der Eingabestream macht dasselbe in umgekehrter Reihenfolge: Für jedes Objekt, das er aus dem Stream liest, weist er eine ID-Nummer zu, die denselben Algorithmus wie der Ausgabestream verwendet, und diese ID-Nummer verweist auf die Objektinstanz in einer Zuordnung. Wenn ein Objekt angezeigt wird, das mit einer ID serialisiert wurde, wird die ursprüngliche Instanz von der Map abgerufen.
So beschreiben es die API-Dokumente :
Mehrere Verweise auf ein einzelnes Objekt werden mithilfe eines Mechanismus zur gemeinsamen Nutzung von Verweisen codiert, sodass Diagramme von Objekten in der gleichen Form wiederhergestellt werden können, wie sie beim Schreiben des Originals vorhanden waren
Dieses Verhalten kann zu Problemen führen: Da der Stream einen festen Verweis auf jedes Objekt enthält (damit er weiß, wann die ID ersetzt werden muss), kann der Arbeitsspeicher knapp werden, wenn Sie viele transiente Objekte in den Stream schreiben. Sie lösen das, indem Sie anrufen reset()
.
In Java wird dies dadurch gelöst, dass die serialisierten Objekte zwischengespeichert werden und das Handle dafür geschrieben wird, wenn es erneut geschrieben wird.
Siehe Schritt 5 unter http://docs.oracle.com/javase/6/docs/platform/serialization/spec/output.html .
quelle