Heim  >  Artikel  >  Java  >  So wenden Sie Java-Serialisierung und -Deserialisierung an

So wenden Sie Java-Serialisierung und -Deserialisierung an

PHPz
PHPznach vorne
2023-04-29 17:37:141350Durchsuche

Java-Serialisierung und -Deserialisierung Byte-Sequenz byte[] in ein Java-Objekt Java Object

      Serialisierungs-API
ObjectOutputStream

Byte-Ausgabestream-Objekt und konvertieren Sie das Objekt. Der Ausgabestream wird in ein geschrieben Datei (in Verbindung mit FileOutputStream verwendet)

Java Object变为一个二进制字节序列byte[]

Java反序列化就是把一个二进制字节序列byte[] 变为Java对象Java Object

序列化API

ObjectOutputStream

字节输出流对象,将对象的输出流写到文件中(结合FileOutputStream使用)

实例:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
或
FileOutputStream fout = new FileOutputStream("1.txt");
ObjectOutputStream out = new ObjectOutputStream(fout);

此外ObjectOutputStream还提供了writeObject()方法来序列化一个对象,并将它发送到输出流。

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
out.writeObject(new Test("Sentiment",10));        //对Test类中的构造方法进行传参

ObjectInputStream

字节输入流对象,将文件中的二进制字节序列进行反序列化操作(结合FileInputStream)

实例:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("1.txt"));
或
FileInputStream fin = new FileInputStream("1.txt");
ObjectInputStream oin = new ObjectInputStream(fin);

此外ObjectInputStream还提供readObject()方法从流中取出下一个对象,并将对象反序列化。它的返回值为Object,因此,需要将它转换成合适的数据类型。

ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
Test o = (Test)In.readObject();
System.out.println(o);        //读取后输出实例理解

实例理解

Test.java(类想要进行序列化操作,必须实现Serializable接口继承)

package Sentiment.unserialize.demo01;

import java.io.Serializable;

public class Test implements Serializable {
    private String name;
    private int age;

    public Test() {
    }

    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

}

Serializable.java

package Sentiment.unserialize.demo01;

import java.io.*;

public class Serializable {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("1.txt"));
        out.writeObject(new Test("Sentiment",10));
        out.close();
    }
}

 UnSerializable.java

package Sentiment.unserialize.demo01;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class UnSerializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream In = new ObjectInputStream(new FileInputStream("1.txt"));
        Test o = (Test)In.readObject();
        System.out.println(o);
    }
}

运行Serializable.java后便得到二进制字节码文件内容

So wenden Sie Java-Serialisierung und -Deserialisierung an

此时在运行UnSerializable.java便得到了二进制字节码反序列化后的内容

So wenden Sie Java-Serialisierung und -Deserialisierung an

serialVersionUID

  • 每个可序列化的类在序列化时都会关联一个版本号 , 这个版本号就是 serialVersionUID 属性

  • serialVersionUID 属性必须通过 static final long 修饰符来修饰 。

  • 如果可序列化的类未声明 serialVersionUID 属性 , 则 Java 序列化时会根据类的各种信息来计算默认的 serialVersionUID 值 . 但是 Oracle 官方文档强烈建议所有可序列化的类都显示声明 serialVersionUID 值 .

实例理解

在Test.java中定义serialVersionUID 其值为1

package Sentiment.unserialize.demo01;

import java.io.Serializable;

public class Test implements Serializable {
    public static final long serialVersionUID = 1L;   //定义serialVersionUID 

    private  String name;
    private  int age;

    public Test() {
    }

    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

}

此时运行Serializable.java进行序列化操作

运行完毕后将serialVersionUID的值定义为2—>public static final long serialVersionUID = 2L;,在运行UnSerializable.java会报错

So wenden Sie Java-Serialisierung und -Deserialisierung an

Transient (瞬态变量)

Transient( 瞬态变量 )是一个 Java 关键词 , 它用于标记类的成员变量在持久化到字节流时不要被序列化 ; 在通过网络套接字流传输字节流时 , transient 关键词标记的成员变量不会被序列化 。此为被static修饰的静态变量也不参与序列化操作。

实例理解

将Test.java中的nameage变量前分别加上transientstaticBeispiel:

package Sentiment.unserialize.demo01;

import java.io.Serializable;

public class Test implements Serializable {
    public static final long serialVersionUID = 1L;  //定义serialVersionUID 
    private transient String name;                     //加上transient
    private static int age;                             //加上static

    public Test() {
    }

    public Test(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

}

Darüber hinaus stellt ObjectOutputStream auch die Methode writeObject() bereit, um ein Objekt zu serialisieren und an den Ausgabestream zu senden.

private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{
    a.defaultReadObject();
    Runtime.getRuntime().exec("calc.exe");
}

ObjectInputStreamSo wenden Sie Java-Serialisierung und -Deserialisierung an

Byte-Eingabestream-Objekt, deserialisiert die binäre Bytesequenz in der Datei (kombiniert mit FileInputStream)

Beispiel:

rrreee

Darüber hinaus bietet ObjectInputStream auch die Methode readObject() ruft das nächste Objekt aus dem Stream ab und deserialisiert das Objekt. Sein Rückgabewert ist Object, daher muss er in einen geeigneten Datentyp konvertiert werden.

rrreee

Beispielverständnis

Test.java (Wenn eine Klasse Serialisierungsoperationen durchführen möchte, muss sie die Serializable-Schnittstellenvererbung implementieren)

rrreeeSo wenden Sie Java-Serialisierung und -Deserialisierung anSerializable.java

rrreee🎜 UnSerializable.java🎜rrreee🎜Nachdem Sie Serializable.java ausgeführt haben, werden Sie Folgendes tun Holen Sie sich den Inhalt der Binärbyte-Codedatei. >🎜 🎜Zu diesem Zeitpunkt wird durch Ausführen von UnSerializable.java der deserialisierte Inhalt des binären Bytecodes abgerufen🎜🎜So wenden Sie Java-Serialisierung und -Deserialisierung an🎜🎜serialVersionUID🎜
  • 🎜Jeder serialisierbaren Klasse wird während der Serialisierung eine Versionsnummer zugeordnet, diese Versionsnummer ist das Attribut „serialVersionUID“🎜
  • 🎜Das Attribut „serialVersionUID“ muss mit dem statischen Final-Long-Modifikator geändert werden. 🎜
  • 🎜Wenn die serialisierbare Klasse das Attribut serialVersionUID nicht deklariert, berechnet Java den Standardwert serialVersionUID basierend auf verschiedenen Informationen über die Klasse während der Serialisierung. Die offizielle Dokumentation von Oracle empfiehlt jedoch dringend, dass alle serialisierbaren Klassen deklariert werden der Wert „serialVersionUID“ Definieren Sie nach der Ausführung den Wert von serialVersionUID als 2—>public static final long serialVersionUID = 2L;. Beim Ausführen von UnSerializable.java wird ein Fehler gemeldet🎜🎜So wenden Sie Java-Serialisierung und -Deserialisierung an🎜🎜Transient (transiente Variable)🎜🎜Transient (transiente Variable) ist A Java-Schlüsselwort, das verwendet wird, um Mitgliedsvariablen einer Klasse zu markieren, die nicht serialisiert werden sollen, wenn sie in einem Byte-Stream gespeichert werden. Bei der Übertragung eines Byte-Streams über einen Netzwerk-Socket-Stream werden durch das Schlüsselwort transient markierte Mitgliedervariablen nicht serialisiert. Dies ist eine statische Variable, die durch statische Variablen geändert wird und nicht an Serialisierungsvorgängen teilnimmt. 🎜🎜Beispiel zum Verständnis🎜🎜Fügen Sie transient bzw. staticvor den Variablen name und age in Test.java hinzu >🎜rrreee🎜Zu diesem Zeitpunkt werden Serializable.java und UnSerializable.java ausgeführt und das Ausgabeergebnis ist: Sentiment—>null, 10—>0🎜🎜🎜🎜🎜readObject()-Methodenumschreibung🎜🎜erlaubt Benutzern offiziell zu serialisieren Überschreiben Sie die readObject()-Methode in der Klasse, und die überschriebene Methode ist für die Rekonstruktion des aktuellen Klassenobjekts während der Deserialisierung verantwortlich. Benutzer müssen nur die defaultReadObject()-Methode in der überschriebenen readObject()-Methode implementieren umgekehrt Der Serialisierungsprozess wird normal ausgeführt 🎜🎜Beispiel zum Verständnis🎜🎜Implementieren Sie den Methodenaufruf defaultReadObject() und schreiben Sie die Methode in der Testklasse neu. Der Befehl kann nach Serialisierungs- und Deserialisierungsvorgängen ausgeführt werden🎜🎜🎜

Das obige ist der detaillierte Inhalt vonSo wenden Sie Java-Serialisierung und -Deserialisierung an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen