Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

Java Objekt-Serialisierung: Objekte persistieren und wiederherstellen

Was ist Objekt-Serialisierung?

Java bietet einen Mechanismus, der Objekt-Serialisierung genannt wird, bei dem ein Objekt als eine Sequenz von Bytes dargestellt werden kann, die die Daten des Objekts sowie Informationen über den Typ des Objekts und die Typen der im Objekt gespeicherten Daten enthalten.

Nachdem ein serialisiertes Objekt in eine Datei geschrieben wurde, kann es aus der Datei gelesen und deserialisiert werden. Das heißt, die Typinformationen und Bytes, die das Objekt und seine Daten repräsentieren, können verwendet werden, um das Objekt im Speicher neu zu erstellen.

Am beeindruckendsten ist, dass der gesamte Prozess JVM-unabhängig ist, was bedeutet, dass ein Objekt auf einer Plattform serialisiert und auf einer völlig anderen Plattform deserialisiert werden kann.

Die Klassen ObjectInputStream und ObjectOutputStream sind High-Level-Streams, die die Methoden für das Serialisieren und Deserialisieren eines Objekts enthalten.

Die ObjectOutputStream-Klasse enthält viele Schreibmethoden für verschiedene Datentypen, aber eine Methode sticht besonders hervor:

public final void writeObject(Object x) throws IOException

Die oben genannte Methode serialisiert ein Objekt und sendet es an den Ausgabestream. Ebenso enthält die ObjectInputStream-Klasse die folgende Methode zum Deserialisieren eines Objekts:

public final Object readObject() throws IOException, ClassNotFoundException

Diese Methode ruft das nächste Objekt aus dem Stream ab und deserialisiert es. Der Rückgabewert ist Object, daher müssen Sie ihn in den entsprechenden Datentyp casten.

Um zu demonstrieren, wie Serialisierung in Java funktioniert, werde ich die Employee-Klasse verwenden, die wir früher im Buch besprochen haben. Angenommen, wir haben die folgende Employee-Klasse, die das Serializable-Interface implementiert:

Beispiel: Serializable Employee-Klasse

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 check to " + name + " " + address);
    }
}

Beachten Sie, dass für eine erfolgreiche Serialisierung einer Klasse zwei Bedingungen erfüllt sein müssen:

Wenn Sie neugierig sind, ob eine Java-Standardklasse serialisierbar ist oder nicht, überprüfen Sie die Dokumentation der Klasse. Der Test ist einfach: Wenn die Klasse java.io.Serializable implementiert, ist sie serialisierbar; andernfalls nicht.

Ein Objekt serialisieren

ObjectOutputStream-Klasse wird verwendet, um ein Objekt zu serialisieren. Das folgende SerializeDemo-Programm instanziiert ein Employee-Objekt und serialisiert es in eine Datei.

Wenn die Programmausführung abgeschlossen ist, wird eine Datei namens employee.ser erstellt. Das Programm erzeugt keine Ausgabe, aber studieren Sie den Code und versuchen Sie zu bestimmen, was das Programm tut.

Hinweis – Beim Serialisieren eines Objekts in eine Datei ist die Standardkonvention in Java, der Datei eine .ser-Erweiterung zu geben.

Beispiel

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();
        }
    }
}

Ein Objekt deserialisieren

Das folgende DeserializeDemo-Programm deserialisiert das Employee-Objekt, das im SerializeDemo-Programm erstellt wurde. Studieren Sie das Programm und versuchen Sie, seine Ausgabe zu bestimmen:

Beispiel

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

Ausgabe:

Deserialized Employee...
Name: Reyan Ali
Address: Phokka Kuan, Ambehta Peer
SSN: 0
Number: 101

Hier sind folgende wichtige Punkte zu beachten:

  • Der try/catch-Block versucht, eine ClassNotFoundException abzufangen, die von der readObject()-Methode deklariert wird. Damit eine JVM ein Objekt deserialisieren kann, muss sie in der Lage sein, den Bytecode für die Klasse zu finden. Wenn die JVM während der Deserialisierung eines Objekts keine Klasse finden kann, wirft sie eine ClassNotFoundException.
  • Beachten Sie, dass der Rückgabewert von readObject() in eine Employee-Referenz gecastet wird.
  • Der Wert des SSN-Feldes war 11122333, als das Objekt serialisiert wurde, aber da das Feld transient ist, wurde dieser Wert nicht in den Ausgabestream gesendet. Das SSN-Feld des deserialisierten Employee-Objekts ist 0.

Java

  1. Javas final-Schlüsselwort verstehen: Variablen, Methoden und Klassen
  2. Java instanceof-Operator: Ein umfassender Leitfaden
  3. Java statische verschachtelte Klassen verstehen: Nutzung, Unterschiede und Beispiele
  4. Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
  5. Java Singleton-Pattern erklärt: Sichere Implementierung und Verwendung
  6. Java Reflection meistern: Klassen, Methoden und Felder zur Laufzeit inspizieren
  7. Java ObjectOutputStream meistern: Serialisierung, Methoden und praktische Beispiele
  8. Java Generics meistern – Wiederverwendbaren, typsicheren Code erstellen
  9. Java-Dateioperationen mit java.io meistern – Erstellen, Lesen, Schreiben & Löschen
  10. Java meistern: Objekte, Klassen und Kern-OOP-Konzepte verstehen