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.
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) –