So wenden Sie Java-Serialisierung und -Deserialisierung an
Java-Serialisierung und -Deserialisierung Byte-Sequenz byte[]
in ein Java-Objekt Java Object
- Serialisierungs-API
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后便得到二进制字节码文件内容
此时在运行UnSerializable.java便得到了二进制字节码反序列化后的内容
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会报错
Transient (瞬态变量)
Transient( 瞬态变量 )是一个 Java 关键词 , 它用于标记类的成员变量在持久化到字节流时不要被序列化 ; 在通过网络套接字流传输字节流时 , transient 关键词标记的成员变量不会被序列化 。此为被static修饰的静态变量也不参与序列化操作。
实例理解
将Test.java中的name
和age
变量前分别加上transient
和static
Beispiel:
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"); }
ObjectInputStream
rrreee
Darüber hinaus bietet ObjectInputStream auch die MethodereadObject()
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ändnisTest.java (Wenn eine Klasse Serialisierungsoperationen durchführen möchte, muss sie die Serializable-Schnittstellenvererbung implementieren)rrreeeSerializable.java
- 🎜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🎜🎜🎜🎜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.static
vor den Variablenname
undage
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

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

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

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.

Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

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

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.

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
