Heim 类库下载 java类库 Java-Serialisierung und Deserialisierung

Java-Serialisierung und Deserialisierung

Oct 29, 2016 am 10:56 AM
java

1. Was ist Serialisierung? Warum serialisieren?

 Java-Serialisierung bezieht sich auf den Prozess der Konvertierung eines Objekts in eine Bytesequenz, während Deserialisierung der Prozess ist, bei dem nur eine Bytesequenz in ein Zielobjekt konvertiert wird.

Wir alle wissen, dass beim Zugriff auf den Browser der Text, die Bilder, das Audio, das Video usw., die wir sehen, über Binärsequenzen übertragen werden. Wenn wir also Java-Objekte übertragen müssen, sollte das Objekt zuerst serialisiert werden? Die Antwort lautet: Ja, wir müssen das Java-Objekt zuerst serialisieren und es dann über das Netzwerk und E/A übertragen. Wenn es das Ziel erreicht, deserialisieren wir es, um das gewünschte Objekt zu erhalten, und schließen schließlich die Kommunikation ab.

2. So implementieren Sie die Serialisierung

2.1. Verwenden Sie die Schlüsselklassen ObjectOutputStream und ObjectInputStream im JDK

In der ObjectOutputStream-Klasse: Durch Verwendung der Methode writeObject(Object object). , das Objekt im Binärformat schreiben.

In der ObjectInputStream-Klasse: Lesen Sie den Binärstrom aus dem Eingabestrom und konvertieren Sie ihn mithilfe der Methode readObject() in ein Objekt.

2.2. Das Zielobjekt muss zuerst die Serialable-Schnittstelle implementieren

Wir erstellen eine Student-Klasse:

public class Student implements Serializable {
    private static final long serialVersionUID = 3404072173323892464L;
    private String name;
    private transient String id;
    private String age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public Student(String name, String id) {
        System.out.println("args Constructor");
        this.name = name;
        this.id = id;
    }

    public Student() {
        System.out.println("none-arg Constructor");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}
Nach dem Login kopieren

Die Student-Klasse im Code implementiert die Serializable-Schnittstelle und generiert eine Versionsnummer:

private static final long serialVersionUID = 3404072173323892464L;
Nach dem Login kopieren

Zunächst einmal:

1. Die Funktion der Serializable-Schnittstelle besteht nur darin Identifizieren Sie, ob unsere Klasse Serialisierung sein muss und die Serializable-Schnittstelle keine Methoden bereitstellt.

2. serialVersionUid Die Serialisierungsversionsnummer wird verwendet, um die Version der von uns geschriebenen Klasse zu unterscheiden und um zu bestimmen, ob die Version der Klasse während der Deserialisierung konsistent ist. Wenn sie inkonsistent ist, tritt eine Versionsinkonsistenzausnahme auf.

3. Das Schlüsselwort transient wird hauptsächlich verwendet, um Variablen zu ignorieren, die wir nicht serialisieren möchten

2.3. Objekte serialisieren oder deserialisieren

  2.3.1 Die erste Schreibmethode:

public static  void main(String[] args){
        File file = new File("D:/test.txt");
        Student student = new Student("孙悟空","12");
        try {
            ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
            outputStream.writeObject(student);
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
            Student s = (Student) objectInputStream.readObject();
            System.out.println(s.toString());
            System.out.println(s.equals(student));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
Nach dem Login kopieren

   Erstellen Sie das Objekt Student und geben Sie das Objekt dann über die Methode writeObject() in der Klasse ObjectOutputStream in die Datei aus.

                                                                           cco Groom inwn und deserialisiert dann über die readObject()-Methode in der ObjectinputStream-Klasse, um das Objekt zu erhalten.

   2.3.2 Die zweite Schreibmethode:

Implementieren Sie die Methoden writeObject() und readObject() in der Student-Klasse:

private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
        objectOutputStream.defaultWriteObject();
        objectOutputStream.writeUTF(id);

    }

    private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
        objectInputStream.defaultReadObject();
        id = objectInputStream.readUTF();
    }
Nach dem Login kopieren

Durch die Serialisierung auf diese Weise können wir die Variablen, die wir serialisieren möchten, anpassen, den Eingabe- und Ausgabestream an die Zeileninstanz übergeben und dann serialisieren und deserialisieren.

 

   2.3.3 Die dritte Schreibmethode:

Der Student implementiert die Externalnalizable-Schnittstelle, implementiert jedoch nicht die Serializable-Schnittstelle

Die Externaliable-Schnittstelle ist eine Unterklasse von Serializable hat die gleiche Funktion wie die Serializable-Schnittstelle:

public class Student implements Externalizable {
    private static final long serialVersionUID = 3404072173323892464L;
    private String name;
    private transient String id;
    private String age;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public Student(String name, String id) {
        System.out.println("args Constructor");
        this.name = name;
        this.id = id;
    }

    public Student() {
        System.out.println("none-arg Constructor");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
        out.writeObject(id);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = (String) in.readObject();
        id = (String) in .readObject();
    }

}
Nach dem Login kopieren

Durch Vergleich mit der vorherigen zweiten Schreibmethode können wir feststellen, dass ihre Implementierungsprinzipien sehr ähnlich sind, die Implementierung der Externalnalizable-Schnittstelle jedoch nicht Unterstützt Die erste Serialisierungsmethode kann Objekte nur durch Implementierung der Methoden writeExternal() und readExternal() in der Schnittstelle serialisieren.

3. Fragen zur Serialisierung im Vorstellungsgespräch:

1. Was ist Serialisierung und wie implementiert man Serialisierung

Serialisierung von Objekten in Java besteht darin, Objekte in Binärsequenzen umzuwandeln, und Deserialisierung darin, Binärsequenzen in Objekte umzuwandeln

 Es gibt viele Möglichkeiten, die Serialisierung in Java zu implementieren

1. Zuerst benötigen Sie zwei IO Es werden die Klassen ObjectInputStream und ObjectOutputStream verwendet: 2. Implementieren Sie die Serializable-Schnittstelle:

Es gibt zwei spezifische Serialisierungsmethoden:

2.1 Direkt über die Klassen ObjectOutputStream und ObjectInputStream Die writeObject() und readObject() Methoden in

   2.2 Durch Implementierung der Methoden writeObject() und readObject() im serialisierten Objekt und Übergabe der ObjectOutputStream- und ObjectInputStream-Objekte wird die Serialisierung abgeschlossen

  3, implementieren Sie die Externalizable-Schnittstelle:

     Objektserialisierung kann nur durch Implementierung der Methoden writeExternal() und readExternal() in der Schnittstelle erreicht werden


2. Schlüsselwort „Transient“? Wie serialisiere ich Variablen, die mit dem Transientenmodifikator geändert wurden?
Die Funktion von transient besteht darin, Variablen abzuschirmen, die wir nicht serialisieren möchten. Das Objekt ignoriert die Variable während des Serialisierungs- und Deserialisierungsprozesses.
Wir können die Methoden writeObject und readObject in der obigen Serialisierungsmethode implementieren und in der Methode die Methoden writeUTF() und readUTF() des Ausgabestreams oder Eingabestreams aufrufen.
Oder implementieren Sie die Externalizable-Schnittstelle, implementieren Sie die Methoden writeExternal() und readExternal() und passen Sie dann das Sequenzobjekt an.

3. Wie kann sichergestellt werden, dass die Objekte nach der Serialisierung und Deserialisierung konsistent sind? (Bitte korrigieren Sie mich, wenn Sie Einwände haben)
Nachdem ich einige Informationen zu diesem Problem konsultiert hatte, stellte ich fest, dass es keine Garantie dafür gibt, dass die Objekte nach der Serialisierung und Deserialisierung konsistent sind, da wir während des Deserialisierungsprozesses zunächst ein Objekt erstellen.
                                           w                                             richider >> Nach dem Erstellen eines neuen Objekts verweisen die Objektreferenz und das Originalobjekt nicht auf dasselbe Ziel.
Daher können wir nur sicherstellen, dass ihre Daten und Versionen konsistent sind, wir können jedoch nicht garantieren, dass die Objekte konsistent sind.


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles