2016-11-06 12 views
3

Was ich verstehe ist, dass ich Serializable Schnittstelle implementieren kann, um mein Objekt serialisierbar zu machen.Serialisierung nicht implementiert?

Aber ich bekomme nicht, wo ist writeObject Methode implementiert, wenn Serializable eine Schnittstelle ist, so dass es keine Implementierung von Methoden enthält, nur eine Definition?

+0

Implementierung von Serializable ist ** nur zur Kennzeichnung **, dass eine Klasse serialisiert werden kann. Sicherstellen, dass alle Mitglieder Serializable sind, ist der Job des Compilers und Serialisierungsprozess ist der Job der JRE (nicht sicher, ob es die JVM- oder die JRE-Bibliotheken sind) –

Antwort

3

Wie Sie bereits bemerkt haben, ist das Serializable ein Marker Interface und hat keine Methoden zu implementieren. Die Implementierung von Serializable ist nur eine Anmerkung, dass diese für die Serialisierung geeignet ist, die unter Verwendung von ObjectOutputStream gehandhabt wird.

Die von Ihnen erwähnten Methoden müssen in einer Klasse implementiert werden, die die Schnittstelle Serializable implementiert und automatisch übernommen wird. Da keine Verpflichtung zur Implementierung besteht, sind sie nicht in der Schnittstelle enthalten.

http://docs.oracle.com/javase/8/docs/platform/serialization/spec/serial-arch.html#a4539

+3

Die Serialisierung erfolgt * extern * zur JVM durch die Klasse 'ObjectOutputStream' . – EJP

+0

Wundert mich, warum dies in Java 1.8 nicht mit Standardmethoden geändert wird. Da es die für diesen speziellen Fall erforderliche Funktionalität bietet. – n247s

+0

@ n247s konnten Sie nur in ein ObjectOutputSTream schreiben und von einem ObjectInputStream mit writeObject/readObject lesen, aber Sie möchten diese Art der Serialisierung möglicherweise nicht verwenden, da gibt es dutzende Alternativen. Es gibt keine gemeinsame Markierschnittstelle für den Stream. Sie können Objekte in Objekte von –

1

Tough alle bisher geschrieben Antworten sind richtig, ich möchte einige zusätzliche Kommentare hinzufügen:

java.io.Serializable war bereits Teil der Java 1.1 API (unter den ersten Versionen von Java), und war als eine einfache Weise für den Programmierer gemeint, jede Klasse zu kennzeichnen, um ein spezielles Verhalten zu haben.

Nach OOP-Prinzipien sollte das durch eine reguläre Schnittstelle getan worden sein, was Sie (und mich und irgendeinen anderen Programmierer) erwartet hätten. Etwas wie folgt aus:

public interface Serializable<E> 
{ 
    public E read(DataInput input) throws IOException; 

    public void write(DataOutput output) throws IOException; 
} 

Aber da gibt es viele Klassen in Java sind, die serialisiert werden mussten, wollten die Programmiersprache Java Designer Probleme für Programmierer sparen, durch eine Art von Mechanismus, durch die Serialisierung automatisch durchgeführt werden würde. Aber wie?

  • Durch eine abstrakte Klasse? Nee. Dies hätte verhindert, dass eine benutzerdefinierte Klasse eine eigene Hierarchie hätte (da es in Java nur einzige Vererbung gibt).

  • Herstellung java.lang.Object serialisierbar? Genauso wenig, weil Programmierer dadurch hätten entscheiden können, welche Klasse serialisierbar sein sollte und welche nicht.

Obendrein gab es ein hughe Problem: Beachten Sie, dass Methode read zu schaffen soll und zurück ein Objekt der Klasse E aus einem Dateneingabestrom. Eine abstrakte Klasse kann keine Instanzen ihrer Unterklassen ohne weitere Informationen erstellen (die abstrakte Klasse weiß nicht, was die angewendete Unterklasse ist).

So entschied sie sich über die OOP zu passieren und bieten Serialisierung als spezielle nicht-oop-Funktion der Serialisierung Klassen Object/Object (Kredite an EJP für dieses Detail) in der Form eines „Dummy“ Schnittstelle erkennbar von ihnen, um den Preis, etwas irgendwie zu den Klassendefinitionen hinzuzufügen, weil eine Schnittstelle ohne Methoden Nonsense ist (dieselbe Annäherung, die sie für java.lang.Cloneable adoptierten).

Eigentlich ist es bringt noch mehr confussion, weil benutzerdefinierte Serialisierung durch die Implementierung private Methoden readObject und writeObject (wie angegeben von ObjectOutputStream) durchgeführt werden muß, die in Form einer Java-Schnittstelle ein Feature nicht describible ist.

Heutzutage kann diese Art von Markierung durch Anmerkungen erfolgen. Nun, denken Sie an Serializable als eine Schnittstelle, die eine Annotation hätte sein sollen, aber immer noch als Schnittstelle für diese Endkompatibilitätsgründe bleibt.

+0

'Serializable' ist weder ein 'Sprachenmerkmal', 'reserviert', noch 'erkennbar an der JVM'. Es ist ein Vertrag zwischen der Klasse und "ObjectInputStream" und "ObjectOutputStream". – EJP

+0

Ein Vertrag ohne Klauseln? Ohne spezifisches Verhalten? Seltsamer Vertrag, indeed.Anyway, du hast Recht. Ich werde das Detail korrigieren. –

+0

* "weil eine Schnittstelle ohne Methoden Unsinn ist" * ... nach Joshua Bloch (Effektive Java, 2. Aufl.) Gibt es Situationen, in denen Marker-Interfaces den Annotationen vorgezogen werden können. – scottb

Verwandte Themen