Serialisierung in Java

Die Serialisierung in Java ist ein Mechanismus, der den Status eines Objekts in einen Byte-Stream konvertiert. Die Deserialisierung ist der umgekehrte Prozess. Durch Deserialisierung wird aus einem Bytestrom ein tatsächliches Java-Objekt im Speicher erstellt. Ein solcher Mechanismus hält das Objekt fest.

Der so durch Serialisierung erzeugte Bytestrom hängt von keiner Plattform ab. Das auf einer Plattform serialisierte Objekt kann problemlos auf jeder anderen Plattform deserialisiert werden. Somit ist der gesamte Serialisierungs- und Deserialisierungsprozess von JVM unabhängig.

Wenn ein Klassenobjekt serialisiert werden soll, muss die Schnittstelle java.io.Serializable implementiert werden. In Java serialisierbar ist ein Marker-Interface. Es sind keine Felder oder Methoden zu implementieren. Durch diesen Prozess wird eine Klasse serialisierbar gemacht, was wie ein Opt-In-Prozess aussieht.

Die Serialisierung in Java wird von den beiden Klassen ObjectInputStream und ObjectOutputStream implementiert.

Alles, was erforderlich ist, ist ein Wrapper über sie, damit sie in einer Datei gespeichert oder über ein Netzwerk gesendet werden können.

Das Konzept der Serialisierung in Java

Die Klasse ObjectOutputStream ist eine Serialisierungsklasse, wie im obigen Abschnitt erwähnt. Sie enthält mehrere Schreibmethoden zum Schreiben verschiedener Datentypen. Am beliebtesten ist jedoch eine Methode

public final void writeObject(Object x) throws IOException

Die obige Methode kann verwendet werden, um ein Objekt zu serialisieren. Diese Methode sendet es auch an den Ausgabestream. Ebenso enthält die ObjectInputStream-Klasse die Methode zur Deserialisierung von Objekten

public final Object readObject() throws IOException, ClassNotFoundException

Die Deserialisierungsmethode ruft das Objekt aus einem Stream ab und deserialisiert es. Der Rückgabewert ist wieder ein Objekt. Sie müssen ihn also nur in den relevanten Datentyp umwandeln.

Damit eine Klasse erfolgreich serialisiert werden kann, müssen zwei Bedingungen erfüllt sein:

  • io. Die serialisierbare Schnittstelle muss von der Klasse implementiert werden.
  • Alle Felder der Klasse müssen serialisierbar sein. Wenn auch nur ein Feld nicht serialisierbar ist, sollte es als vorübergehend markiert werden.

Wenn jemand überprüfen muss, ob eine Klasse serialisierbar ist oder nicht, besteht die einfache Lösung darin, zu überprüfen, ob die Klasse die Methode java.io.Serializable implementiert. Wenn dies der Fall ist, ist sie serialisierbar, wenn dies nicht der Fall ist, ist dies nicht der Fall.

Es ist zu beachten, dass beim Serialisieren eines Objekts in eine Datei der Datei standardmäßig die Erweiterung .ser zugewiesen wird.

Serialisierungsmethode in Java

Wenn diese Methoden in der Klasse vorhanden sind, werden sie für die Serialisierung in Java-Zwecken verwendet.

Methode Beschreibung
public final void writeObject (Object obj) löst IOException aus ()Dadurch wird das angegebene Objekt in den ObjectOutputStream geschrieben.
public void flush () löst IOException () ausDadurch wird der aktuelle Ausgabestream gespült.
public void close () löst IOException () ausDadurch wird der aktuelle Ausgabestream geschlossen.

Deserialisierungsmethode in Java

Methode Beschreibung
public final Object readObject () löst IOException, ClassNotFoundException () ausDadurch wird ein Objekt aus dem Eingabestream gelesen.
public void close () löst IOException () ausDadurch wird ObjectInputStream geschlossen.

Beispiele für die Serialisierung in Java

In diesem Abschnitt haben wir die Serialisierung in Java anhand von Beispielen erläutert.

Anhand eines Beispiels in Java wird gezeigt, wie die Serialisierung in Java funktioniert. Wir erstellen eine Employee-Klasse, um einige Funktionen zu untersuchen, und der Code dafür ist unten angegeben. Diese Mitarbeiterklasse implementiert die Serializable-Schnittstelle.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

Wenn dieses Programm ausgeführt wird, wird eine Datei mit dem Namen employee.ser erstellt. Dieses Programm bietet keine garantierte Ausgabe, sondern dient nur zu Erklärungszwecken. Ziel ist es, seine Verwendung und Funktionsweise zu verstehen.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

Das unten beschriebene DeserializeDemo-Programm deserialisiert das oben im Serialize Demo-Programm erstellte Employee-Objekt .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

Der obige Code führt zu folgendem Ergebnis:

Ausgabe

Deserialisierter Mitarbeiter…

Name: Rahul Jain

Adresse: epip, Bangalore

SSN: 0

Nummer: 131

Einige wichtige Punkte im Zusammenhang mit dem obigen Programm sind nachfolgend aufgeführt:

  • Der obige try / catch-Block versucht, eine ClassNotFoundException abzufangen. Dies wird durch die Methode readObject () deklariert.
  • Eine JVM kann ein Objekt nur deserialisieren, wenn sie den Bytecode für die Klasse findet.
  • Wenn die JVM während der Deserialisierung keine Klasse findet, wird ClassNotFoundException ausgelöst.
  • Der Rückgabewert von readObject () wird immer in eine Mitarbeiterreferenz umgewandelt.
  • Der SSN-Feldwert war anfangs 114433, als das Objekt serialisiert wurde, da dieser Wert jedoch nicht an den Ausgabestream gesendet wurde. Aus diesem Grund ist das deserialisierte SSN-Feldobjekt des Mitarbeiters 0.

Fazit

Oben haben wir Serialisierungskonzepte vorgestellt und Beispiele bereitgestellt. Lassen Sie uns die Notwendigkeit der Serialisierung als unsere abschließenden Bemerkungen verstehen.

  • Kommunikation: Wenn zwei Computer mit demselben Code miteinander kommunizieren müssen, besteht der einfache Ausweg darin, dass ein Computer ein Objekt mit den zu übertragenden Informationen erstellt und dieses Objekt anschließend serialisiert, bevor es an den anderen Computer gesendet wird. Keine großartige Methode, aber erledigt den Job.
  • Persistenz: Wenn der Betriebsstatus in einer Datenbank gespeichert werden soll, wird er zuerst in ein Byte-Array serialisiert und dann in der Datenbank gespeichert, um zu einem späteren Zeitpunkt abgerufen zu werden.
  • Deep Copy: Wenn eine exakte Kopie eines Objekts erstellt werden muss und das Schreiben einer speziellen Klonklasse zu schwierig ist, können Sie das Ziel erreichen, indem Sie das Objekt erst serialisieren und dann zu einem anderen Objekt de-serialisieren.
  • JVM-übergreifende Synchronisierung: Verschiedene JVMs, die auf verschiedenen Computern und Architekturen ausgeführt werden, können synchronisiert werden.

Empfohlene Artikel

Dies war eine Anleitung zur Serialisierung in Java. Hier haben wir die verschiedenen Serialisierungsmethoden in Java anhand von Beispielen erläutert. Sie können auch den folgenden Artikel lesen, um mehr zu erfahren -

  1. Fragen in Vorstellungsgesprächen für Java Developer
  2. Java-Liste vs Array-Liste
  3. Verwendung von JavaScript