2009-03-31 11 views

Antwort

19

Es gibt eine schöne Beschreibung im letzten Abschnitt von Josh Bloch Effektive Java, Second Edition.

Angenommen, Sie haben eine Klasse A, die Sie serialisieren möchten. Sie deklarieren es zuerst, um Serializable zu implementieren. Dann verwenden Sie die Serialisierungsmethode writeReplace(), um einen sogenannten "Serialisierungs-Proxy" zurückzugeben, der anstelle der Instanz A serialisiert wird. Die Methode writeReplace() muss nicht öffentlich sein. Die Standardserialisierung unter A wird nie aufgerufen, sodass alle API-Eigenschaften von A beibehalten werden können.

Normalerweise ist der Proxy als private static geschachtelte Klasse implementiert, die selbst Serializable (oder Externalizable für die vollständige Kontrolle des Lese-/Schreibvorgangs implementieren muss). Da der Proxy privat ist, werden seine Implementierungsdetails, z. B. mit einem Konstruktor ohne Argumente und veränderbar, ausgeblendet.

Der Proxy speichert genug Status des ursprünglichen Objekts, das geschrieben werden soll, damit das Objekt bei der Deserialisierung wiederhergestellt werden kann. Bei der Deserialisierung verwendet der Proxy die Methode readResolve(), um eine Instanz von A zurückzugeben. Bei Singletons kann dies die Singleton-Instanz selbst sein.

Ich schrieb einen ausführlichen Blogeintrag mit Beispielen, Serializing Immutables and Singletons with a Serialization Proxy.

+0

Ich fragte mich, ob der Serialisierungs-Proxy Externalisierbar sein könnte. Das Buch erwähnt nur Serializable. Vielen Dank! –