English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java Grund教程

Java Flow Control

Java Array

Java objektorientiert (I)

Java objektorientiert (II)

Java objektorientiert (III)

Java Ausnahmebehandlung

Java Liste (List)

Java Queue (Warteschlange)

Java Map-Kollektion

Java Set-Kollektion

Java Ein- und Ausgabemethoden (I/O)

Java Reader/Writer

Andere Themen von Java

Java Serialisierung

Java bietet ein Mechanismus für die Objektserialisierung, bei dem ein Objekt als Byte-Reihe dargestellt werden kann, die die Daten des Objekts, die Informationen über den Typ des Objekts und die Typen der in dem Objekt gespeicherten Daten enthält.

Nachdem das serialisierte Objekt in eine Datei geschrieben wurde, kann es aus der Datei gelesen und deserialisiert werden, das bedeutet, dass die Typinformationen des Objekts, die Daten des Objekts und die Typen der in dem Objekt gespeicherten Daten verwendet werden können, um ein neues Objekt im Speicher zu erstellen.

Der gesamte Prozess ist unabhängig vom Java Virtual Machine (JVM), das bedeutet, dass ein serialisiertes Objekt auf einer Plattform in einer vollständig anderen Plattform deserialisiert werden kann.

Die Klassen ObjectInputStream und ObjectOutputStream sind hochstufige Datenflüsse, die Methoden zur Serialization und Deserialization von Objekten enthalten.

Die Klasse ObjectOutputStream enthält viele Methoden zum Schreiben verschiedener Datentypen, aber eine spezielle Methode ist ausgenommen:

public final void writeObject(Object x) throws IOException

Die obige Methode serialisiert ein Objekt und sendet es an den Ausgabestrom. Eine ähnliche Klasse ObjectInputStream enthält folgende Methoden zur Deserialization eines Objekts:

public final Object readObject() throws IOException, 
                                 ClassNotFoundException

Diese Methode liest das nächste Objekt aus dem Stream aus und serialisiert das Objekt. Der Rückgabewert ist Object, daher müssen Sie es in den passenden Datentyp umwandeln.

Um zu demonstrieren, wie Serialisierung in Java funktioniert, werde ich den in den vorherigen Tutorials erwähnten Employee-Klasse verwenden. Angenommen, wir haben die folgende Employee-Klasse definiert, die das Interface Serializable implementiert.

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("Eine Überweisung an " + name
                           + " " + address);
   }
}

Bitte beachten Sie, dass zwei Bedingungen erfüllt sein müssen, damit ein Objekt einer Klasse erfolgreich serialisiert werden kann:

Die Klasse muss das Interface java.io.Serializable implementieren.

Alle Attribute der Klasse müssen serialisierbar sein. Wenn ein Attribut nicht serialisierbar ist, muss dieses Attribut als transient markiert werden.

Wenn Sie wissen möchten, ob eine Java-Standardklasse serialisierbar ist, lesen Sie bitte die Dokumentation der Klasse. Es ist einfach, zu überprüfen, ob ein Beispiel einer Klasse serialisiert werden kann, indem überprüft wird, ob die Klasse das Interface java.io.Serializable implementiert.

Objekte serialisieren

ObjectOutputStream wird verwendet, um ein Objekt zu serialisieren. Der folgende SerializeDemo-Beispiel zeigt, wie ein Employee-Objekt erstellt und in eine Datei serialisiert wird.

Nach der Ausführung dieses Programms wird eine Datei mit dem Namen employee.ser erstellt. Das Programm gibt nichts aus, aber Sie können die Funktion des Programms durch die Analyse des Codes verstehen.

Beachtung: Wenn ein Objekt in eine Datei serialisiert wird, ist es nach den Standardvereinbarungen von Java erforderlich, der Datei eine .ser Erweiterung hinzuzufügen.

import java.io.*;
 
public class SerializeDemo
{
   public static void main(String [] args)
   {
      Employee e = new Employee();
      e.name = "Reyan Ali";
      e.address = "Phokka Kuan, Ambehta Peer";
      e.SSN = 11122333;
      e.number = 101;
      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 is saved in /tmp/employee.ser");
      catch(IOException i)
      {
          i.printStackTrace();
      }
   }
}

反序列化对象

下面的 DeserializeDemo 程序示例了反序列化,/tmp/employee.ser 存储了 Employee 对象。

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 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("Zahl: ")} + e.number);
    }
}

Das Compiler- und Laufzeitergebnis des obigen Programms ist wie folgt:

Deserialisierter Employee...
Name: Reyan Ali
Adresse: Phokka Kuan, Ambehta Peer
SSN: 0
Zahl:101

Hier sind einige wichtige Punkte zu beachten:

try im readObject() Methoden/Der catch-Block versucht, die Exception ClassNotFoundException zu fangen. Für JVM, die Objekte deserialisieren können, muss die Klasse Bytecode finden können. Wenn die JVM während des Deserialisierungsprozesses die Klasse nicht finden kann, wird eine Exception ClassNotFoundException ausgelöst.

Beachten Sie, dass der Rückgabewert der Methode readObject() in eine Employee-Referenz umgewandelt wird.

Wenn ein Objekt serialisiert wird, beträgt der Wert der Eigenschaft SSN 111222333,aber da dieses Attribut kurzlebig ist, wurde der Wert nicht an den Ausgabestrom gesendet. Daher beträgt der SSN-Wert des Employee-Objekts nach der Deserialisierung 0.