Wenn Sie Objekte mit einer ObjectOutputStream
serialisieren, "erinnert" sich der Stream daran, welche Objekte er bereits geschrieben hat. Wenn das gleiche Objekt erneut geschrieben werden muss, wird das gesamte Objekt nicht erneut geschrieben, stattdessen wird eine Kennung geschrieben, die als "Rückverweis" bezeichnet wird.
Das empfangende ObjectInputStream
wird auch verfolgen, welche Objekte empfangen wurden, und wird - beim Lesen einer Rückverweisliste - das gleiche Objekt zurückgeben, das es zuvor gelesen hat. Wie in der answer by CoronA10 erläutert, wird dies - unter anderem - zum Serialisieren von Objekten verwendet, die zueinander zeigen, aber auch um sicherzustellen, dass die Identitätsgleichheit in einer JVM bei der Serialisierung zu einer anderen JVM erhalten bleibt.
Verfahren readUnshared
(und sein Gegenstück writeUnshared
) verwendet werden, von diesem Verhalten zu lösen: Es stellt sicher, dass das Objekt lesen (geschrieben) eindeutig sein wird (und nicht als Rückverweis wiederverwendet). Das ist ziemlich weit fortgeschritten und ich kann mich nicht erinnern, es jemals gesehen oder benutzt zu haben, aber andererseits sehe ich selten die Verwendung von Serialisierung überhaupt.
Darauf bezieht sich eine Rückverweisung nicht.Es hat nichts mit Zirkelverweisen zu tun, obwohl sie sehr von Rückreferenzen profitieren würden. – 4castle
Das Serialisieren einer kreisförmigen Struktur wie dem mit 'writeUnshared' würde eine' StackOverflowException' auslösen. – 4castle
Aus meiner Sicht gibt es mehrere Szenarien, in denen Rückreferenzen benötigt werden. Und Zirkelverweise sind ein Teil von ihnen. Ja - writeUnshared wird wahrscheinlich fehlschlagen, aber zu der Zeit, als ich diese Antwort schrieb, erwähnte niemand readUnshared. – CoronA