Serialisierbare Schnittstelle in Java mit Beispielen

Veröffentlicht: 2021-11-29

Java bietet mehrere Pakete an, von denen das Interface Serializable eines ist. Es ist im Java-Paket java.io enthalten und eine Art Marker-Schnittstelle. Wenn es als Marker-Schnittstelle definiert ist, sind in der Schnittstelle keine Methoden oder Felder vorhanden. Wenn also Klassen die Schnittstelle implementieren, muss die Schnittstelle keine Methoden implementieren. Die Klassen implementieren die Schnittstelle, wenn eine Klasse möchte, dass ihre Instanzen serialisiert oder deserialisiert werden.

Der Mechanismus der Serialisierung wird für die Umwandlung eines Objektzustands in einen Bytestrom verwendet. Dieser Mechanismus wird durch die Verwendung des ObjectOutputStream ausgeführt. Der Prozess der Deserialisierung ist genau das Gegenteil des Prozesses der Serialisierung. In diesem Fall wird der Bytestrom zurück in das Java-Objekt konvertiert. ObjectInputStream wird zur Deserialisierung verwendet.

Inhaltsverzeichnis

Serialisierung

Die Umwandlung des Zustands eines beliebigen Objekts in einen Bytestrom wird als Serialisierung bezeichnet. Und das Gegenteil von Serialisierung ist Deserialisierung. Ein Java-Objekt kann in einen Strom statischer Bytes umgewandelt werden. Dieser statische Stream kann dann in einer Datenbank gespeichert oder auch in ein anderes Netzwerk übertragen werden. Der Prozess der Serialisierung ist instanzabhängig. Das bedeutet, dass die Serialisierung von Objekten auf einer Plattform durchgeführt werden kann und anschließend die Deserialisierung der Objekte auf einer anderen Plattform. Für den Serialisierungsprozess ist eine spezielle Art von Marker-Schnittstelle „Serializable“ implementiert. Daher sollten die für die Serialisierung geeigneten Klassen, dh die serialisierbare Klasse in Java , die Markierungsschnittstelle implementieren.

Dieser Mechanismus zum Schreiben eines Objektzustands in einen Bytestrom wird als Serialisierung bezeichnet. Der Mechanismus wird hauptsächlich in JMS-, EJB-, JPA-, RMI- und Hibernate-Technologien verwendet.

ObjectInputStream und ObjectOutputStream sind die Formen von High-Level-Klassen, die java.io.InputStream und java.io.OutputStream erweitern. Die primitiven Typen und die Objektgraphen können vom ObjectOutputStream in einem Byte in den OutputStream geschrieben werden

Strom. Der aus der Konvertierung resultierende Stream kann über den ObjectInputStream gelesen werden. Für die Serialisierung wird also die Methode writeObject() aus dem ObjectOutputStream aufgerufen und für die Deserialisierung wird die Methode readObject() aus der Klasse ObjectInputStream aufgerufen.

Die wichtigste Methode in ObjectOutputStream ist:

Die obige Codezeile stammt von https://www.baeldung.com/java-serialization.

In der obigen Codezeile wird ein serialisierbares Objekt genommen und dann in einen Stream oder Stream von Bytes umgewandelt.

Im Fall von ObjectInputStream ist die kritischste Methode:

Die obige Codezeile stammt von https://www.baeldung.com/java-serialization.

Die obige Codezeile kann die Folge von Bytes lesen und diesen Bytestrom in ein Objekt von Java umwandeln. Dadurch kann das ursprüngliche Objekt zurückgeworfen werden.

Eine Veranschaulichung des Serialisierungsprozesses kann im Folgenden beschrieben werden:

Für die Serialisierung wird eine Klasse „Person“ betrachtet. Die statischen Felder sind nicht serialisiert und gehören zu einigen Klassen. Die Klassenfelder können bei der Serialisierung mit dem Schlüsselwort „transient“ ignoriert werden.

Quelle

Das Objekt des Personentyps kann in einer lokalen Datei gespeichert werden, und dann wird der Wert wieder eingelesen. Der unten gezeigte Code kann für diesen Zweck verwendet werden.

ObjectOutputStream wurde zum Speichern des Objektstatus in einer Datei mithilfe von FileOutputStream verwendet. In diesem Beispiel wurde im Projektverzeichnis eine Datei mit dem Namen „yourfile.txt“ erstellt. Durch die Verwendung von FileInputStream wird die erstellte Datei geladen. Dieser Stream wird dann vom ObjectInputStream aufgenommen und in ein neues Objekt mit dem Namen p2 konvertiert. Der Zustand des geladenen Objekts wird schließlich getestet und mit dem Zustand des ursprünglichen Objekts abgeglichen. Das geladene Objekt muss explizit auf die typische Person gecastet werden.

Vorbehalte bei der Java-Serialisierung

1. Vererbung und Zusammensetzung

Immer wenn ein Benutzer die Schnittstelle java.io.Serializable implementiert, werden alle Unterklassen der Klasse, die die Schnittstelle implementieren, serialisierbar. Wenn ein Objekt einen Verweis auf ein anderes Objekt enthält, sind die Objekte, auf die verwiesen wird, um die Schnittstelle zu implementieren, separat serialisierbar; Wenn diese Objekte die Schnittstelle nicht implementieren, wird eine Ausnahme ausgegeben. Die ausgegebene Ausnahme ist NotSerializableException. Auch wenn angenommen wird, dass ein Array von Objekten in einem serialisierbaren Objekt gespeichert ist, sollten alle Array-Objekte serialisiert werden. Wenn keine Serialisierung der Objekte erfolgt, wird die Ausnahme „NotSerializableException“ ausgelöst.

2. Seriennummern-UID

Für jede Klasse, die die Serializable-Schnittstelle implementiert, wird jeder Klasse eine Zahl zugeordnet. Die Nummer ist der Java Virtual Machine zugeordnet. Dies geschieht hauptsächlich, um zu überprüfen, ob die geladenen und gespeicherten Objekte die genauen Attribute haben. Nur wenn die Attribute gleich sind, wären die Objekte bei der Serialisierung kompatibel. IDEs generieren diese Nummern automatisch und basieren hauptsächlich auf den Namen der Klasse, ihren Attributen und den damit verbundenen Zugriffsmodifikatoren. Eine Ausnahme „InvalidClassException“ wird geworfen, wenn sich aus den Änderungen eine andere Zahl ergibt.

Wenn eine serialVersionUID nicht von einer serialisierbaren Klasse deklariert wird, generiert die JVM sie automatisch während der Laufzeit. Obwohl die Nummer automatisch generiert wird, wird dennoch empfohlen, dass die Klassen eine serialVersionUID deklarieren. Dies liegt daran, dass die automatisch generierte serialVersionUID vom Compiler abhängig ist und manchmal unerwartete InvalidClassExceptions auslösen kann.

3. Benutzerdefinierte Serialisierung

In Java wurde eine Standardmethode zum Serialisieren der Objekte festgelegt. Java kann dieses Standardverhalten überschreiben. Es gibt eine Möglichkeit zur benutzerdefinierten Serialisierung. Dies ist besonders nützlich in Fällen, in denen versucht wird, das Objekt mit deserialisierbaren Attributen zu serialisieren. Die Serialisierung für solche Objekte kann durch zwei Methoden innerhalb einer Klasse erfolgen, die der Benutzer serialisieren möchte. Diese beiden Methoden sind:

Die beiden oben genannten Methoden können verwendet werden, um die Attribute in beliebige serialisierbare Formen zu serialisieren, die früher deserialisierbar waren.

Vorteile der Serialisierung in Java

Einer der Vorteile der Serialisierung in Java besteht darin, dass der Status eines Objekts in einem Netzwerk übertragen werden kann.

Die Java-Schnittstelle java.io.Serializable

java.io.Serializable ist eine Marker-Schnittstelle, was bedeutet, dass es keine Methoden und Objekte innerhalb der Schnittstelle gibt. Die primäre Funktion der Marker-Schnittstelle ist das Markieren von

Klassen von Java, um allen Objekten der Klassen eine bestimmte Fähigkeit zu verleihen. Beispiele für Marker-Schnittstellen sind Remote und Cloneable.

Die Schnittstelle muss von jeder Klasse implementiert werden, die die Schnittstelle zum Serialisieren ihrer Objekte verwendet. Standardmäßig implementieren die Klassen wie Wrapper-Klassen und die String-Klasse das Interface java.io.Serializable.

Ein java-serialisierbares Beispiel ist unten gezeigt.

Im obigen Code kann beobachtet werden, dass die Klasse Student die Schnittstelle Serializable implementiert. Daher können, sobald die Klasse die Schnittstelle Serializable implementiert, die Objekte innerhalb der Klasse in Stream-Bytes umgewandelt werden.

  • ObjectOutputStream-Klasse

Diese Klasse wird zum Schreiben der primitiven Datentypen und der Java-Objekte in den OutputStream verwendet. Das Objekt, das die Schnittstelle java.io.Serializable unterstützt, kann zum Schreiben in Streams verwendet werden.

  • ObjectInputStream-Klasse

Alle primitiven Daten, die mit ObjectOutputStream durchgeschrieben wurden, werden mit ObjectInputStream deserialisiert.

Ein Beispiel für eine serialisierbare Schnittstelle in Java ist unten dargestellt.

In diesem Beispiel wird die Klasse Student serialisiert. Die Methode writeObject() der Klasse ObjectOutputStream stellt die gesamte Funktionalität zum Serialisieren der Objekte bereit. Der Zustand des Objekts wird in einer Datei mit dem Namen f.txt gespeichert.

Schlussfolgerungen

Der Artikel diskutierte das Konzept der Serialisierung in Java. Es listete die Schnittstellen und die anderen wichtigen Methoden auf, die für die Serialisierung der Objekte einer Klasse erforderlich sind. Der Prozess der Serialisierung ist bei jeder serialisierbaren Klasse immer mit einer ID oder einer Nummer verbunden. Diese Zahl wird als SerialVersionUID bezeichnet. Der Hauptzweck der SerialVersionUID besteht darin, den Absender und den Empfänger für das zu serialisierende Objekt zu überprüfen. Dies liegt daran, dass sowohl der Absender als auch der Empfänger identisch sein sollten.

Es ist ein wichtiges Merkmal der Programmiersprache Java. Wenn Sie mehr über solche wichtigen Funktionen und Konzepte in Java erfahren und Ihre Programmiersprachenkenntnisse verbessern möchten, können Sie die von upGrad angebotenen Softwareentwicklungskurse besuchen. Wenn Sie berufstätig sind, ist der Kurs am besten für Sie geeignet. Bei Fragen jeglicher Art kann unser Support-Team kontaktiert werden. Sie können auch auf unserer Website nach dem jeweiligen Kurs suchen und detaillierte Informationen erhalten.

Was ist eine serialisierbare Schnittstelle in Java?

Die serialisierbare Schnittstelle ist eine Markerschnittstelle. Die Markierungsschnittstelle gibt der Java-Laufzeit einen Hinweis darauf, dass die implementierende Klasse es zulässt, dass sie serialisiert wird. Die Laufzeit nutzt diese Schnittstelle, um das Objekt zu serialisieren. Die serialisierbare Schnittstelle in Java ist eine spezielle Schnittstelle, die von Datenklassen in Java implementiert werden soll. Wenn eine Klasse diese Schnittstelle implementiert, kann sie in einer Datenbank gespeichert werden. Diese Schnittstelle ist im Paket java.io deklariert. Die serialisierbare Schnittstelle hat zwei Methoden, readResolve() und writeReplace() , die zum Lesen und Schreiben von Objekten in der Datenbank verwendet werden.

Was passiert, wenn wir die Serializable-Schnittstelle in Java implementieren?

Das Implementieren einer serialisierbaren Schnittstelle in Java bedeutet, ein Objekt zu haben, das in jedem System mit einer serialisierbaren Schnittstelle serialisiert und deserialisiert werden kann. Die Implementierung einer solchen Schnittstelle wäre effektiv, wenn die Klasse extern durch Bibliotheken von Drittanbietern (JSON, XML usw.) oder durch Netzwerkprotokolle serialisiert wird. Wenn eine Variable als serialisierbar deklariert wird, wird jede Instanz der Variablen serialisiert und deserialisiert, wenn sie als Parameter an eine Methode übergeben oder von einer Methode zurückgegeben wird. Die Serialisierung wird programmgesteuert durchgeführt, sodass der Zustand eines Objekts für später aufbewahrt werden kann, wenn es deserialisiert und dem Benutzer des Objekts präsentiert werden muss.

Können wir ein serialisiertes Objekt über das Netzwerk übertragen?

Ein serialisiertes Objekt ist ein Objekt, das einen Strom von Bytes enthält. Der Konstruktor des Objekts oder die Methoden writeObject() / readObject() werden verwendet, um den Bytestrom in das Objekt zu platzieren. Bei den gespeicherten Daten kann es sich um Text-, Audio-, Video- oder benutzerdefinierte Anwendungsdaten handeln. Die Daten für diese Objekte können in einer Datei oder auf einem entfernten Server gespeichert werden. Um serialisierte Objekte über das Netzwerk zu übertragen, muss das RMI-Protokoll (Remote Method Invocation) verwendet werden. RMI ist ein gutes Protokoll zum Erstellen verteilter Anwendungen. Es ermöglicht dem Client, mit Methoden für Objekte in einer Java-Anwendung zu kommunizieren, die auf einem Server ausgeführt wird. Das RMI-Protokoll ist ein Remote Procedure Call (RPC)-Mechanismus.