2013-05-08 5 views
6

Meine Unterklasse implementiert Serializable, aber meine Oberklasse nicht.Wird die Serialisierung die Superklassenfelder speichern?

Sowohl Unterklasse als auch Oberklasse enthalten Variablen, die als Teil des Status der Unterklasse gespeichert werden müssen.

Wird die Serialisierung die Superklassenfelder speichern?

+0

http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance –

Antwort

3

Wenn die Superklasse nicht Serializable ist, werden Felder nicht serialisiert. Außerdem brauchen Sie einen Konstruktor ohne Argumente in der Oberklasse.

Als Dokumentation sagt:

Bei der Deserialisierung der Felder nicht serialisierbaren Klassen kein argument Konstruktor der Klasse mit dem öffentlichen oder geschütztem initialisiert werden. Auf die Unterklasse, die serialisierbar ist, muss ein No-Arg-Konstruktor zugreifbar sein.

+0

Wie kann ich wissen, ob übergeordnete Klasse ist oder nicht 'Serializable'? – Danijel

+0

Sie können überprüfen, welche Schnittstellen es implementiert. –

+0

oder Sie können mit instanceof -Operator überprüfen – Amol

19

eine übergeordnete Klasse Felder können nicht serialisiert werden, wenn es nicht Serializable.Here ist eine Zusammenfassung einiger Regeln der Java Serialisierung ist:

  • Ein Objekt serialisierbar ist nur, wenn seine Klasse oder ihrer Oberklasse implementiert die Serializable (oder Externalizable) Schnittstelle.

  • Ein Objekt ist serialisierbar (selbst implementiert die Serializable-Schnittstelle), auch wenn seine Oberklasse nicht ist. Die erste Supersystemklasse in der Hierarchie der serialisierbaren Klasse, die die Serializable-Schnittstelle nicht implementiert, muss jedoch einen Konstruktor ohne Argumente haben. Wenn dies verletzt wird, erzeugt readObject() in Laufzeit java.io.InvalidClassException.

  • Der Nicht-Arg-Konstruktor jeder nicht serialisierbaren Superklasse wird ausgeführt, wenn ein Objekt deserialisiert wird. Die deserialisierten Objekte? Konstruktor wird nicht ausgeführt, wenn es deserialisiert wird.

  • Die Klasse muss zum Zeitpunkt der Serialisierung sichtbar sein.

  • Alle primitiven Typen sind serialisierbar.

  • Transiente Felder (mit Übergangsmodifikator) werden NICHT serialisiert (d. H. Nicht gespeichert oder wiederhergestellt). Eine Klasse, die Serializable implementiert, muss-Transient-Felder von Klassen markieren, die keine Serialisierung unterstützen (z. B. einen Dateistream).

  • Statische Felder (mit statischem Modifikator) sind nicht serialisiert.

  • Wenn sich Membervariablen eines serialisierbaren Objekts auf ein nicht serialisierbares Objekt beziehen, wird der Code kompiliert, es wird jedoch eine RumtimeException ausgelöst.

+0

Sehr nützlich, danke. – Danijel

+4

Bitte geben Sie eine Quelle an, wenn Sie eine Kopier-Paste-Lösung verwenden (für alle Interessierten: http://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208) –

Verwandte Themen