Maison >Java >javaDidacticiel >Comment appliquer la sérialisation et la désérialisation Java
La sérialisation Java convertit un objet Objet Java
Devient un octet binaire séquence byte[]
Java Object
变为一个二进制字节序列byte[]
Java反序列化就是把一个二进制字节序列byte[]
变为Java对象Java Object
字节输出流对象,将对象的输出流写到文件中(结合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类中的构造方法进行传参
字节输入流对象,将文件中的二进制字节序列进行反序列化操作(结合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 属性必须通过 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( 瞬态变量 )是一个 Java 关键词 , 它用于标记类的成员变量在持久化到字节流时不要被序列化 ; 在通过网络套接字流传输字节流时 , transient 关键词标记的成员变量不会被序列化 。此为被static修饰的静态变量也不参与序列化操作。
将Test.java中的name
和age
变量前分别加上transient
和static
byte[]
en un objet Java Java Object
API de sérialisationObjectOutputStream
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 + '}'; } }De plus, ObjectOutputStream fournit également la méthode
writeObject()
pour sérialiser un objet et il est envoyé au flux de sortie. private void readObject(java.io.ObjectInputStream a) throws IOException, ClassNotFoundException{ a.defaultReadObject(); Runtime.getRuntime().exec("calc.exe"); }
Exemple :
rrreee#🎜🎜#De plus, ObjectInputStream fournit également la méthodereadObject()
pour retirer l'objet suivant du flux et désérialiser l'objet. Sa valeur de retour est Object, elle doit donc être convertie en un type de données approprié. #🎜🎜#rrreee#🎜🎜#Exemple de compréhension#🎜🎜##🎜🎜#Test.java (Si une classe souhaite effectuer des opérations de sérialisation, elle doit implémenter l'héritage d'interface sérialisable)#🎜🎜#rrreee#🎜🎜#Seriallessly. java# 🎜🎜#rrreee#🎜🎜# UnSeriallessly.java#🎜🎜#rrreee#🎜🎜#Après avoir exécuté Seriallessly.java, vous obtiendrez le contenu du fichier de bytecode binaire#🎜🎜##🎜🎜##🎜🎜##🎜🎜#UnSerializing.java s'exécute sur cette fois, vous obtiendrez le contenu désérialisé du bytecode binaire#🎜🎜##🎜🎜##🎜🎜##🎜🎜#serialVersionUID#🎜🎜#serialVersionUID
comme 2—>public static final long serialVersionUID = 2L;, une erreur sera signalée lors de l'exécution de UnSerializing.java#🎜🎜##🎜🎜##🎜🎜##🎜🎜#Transient (variable transitoire)#🎜 🎜##🎜🎜#Transient(transient variable) est un mot-clé Java, qui est utilisé pour marquer les variables membres de la classe à ne pas être sérialisées lors de la persistance dans le flux d'octets lors de la transmission du flux d'octets via le flux de socket réseau, le Les variables membres marquées avec le mot-clé transient ne seront pas sérialisées. Il s'agit d'une variable statique modifiée par static et ne participe pas aux opérations de sérialisation. #🎜🎜##🎜🎜#Exemple de compréhension#🎜🎜##🎜🎜#Ajoutez transient avant les variables <code>name
et age
dans Test.java respectivement code> et static
#🎜🎜#rrreee#🎜🎜#À ce stade, Seriallessly.java et UnSerializing.java sont exécutés et les résultats de sortie sont : Sentiment—>null, 10—> 0#🎜 🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#readObject() méthode overriding#🎜🎜##🎜🎜# Permet officiellement aux utilisateurs de remplacer la méthode readObject() dans la classe sérialisée. La méthode écrite sera chargée de reconstruire l'objet de classe actuel pendant la désérialisation. Les utilisateurs n'ont qu'à implémenter la méthode defaultReadObject() dans la méthode readObject() substituée pour garantir que le processus de désérialisation est exécuté normalement.#🎜🎜## 🎜🎜#Instance. compréhension#🎜🎜##🎜🎜#Implémentez l'appel de la méthode defaultReadObject() et réécrivez la méthode dans la classe Test Vous pouvez exécuter la commande après les opérations de sérialisation et de désérialisation#🎜🎜#rrreee#🎜 🎜##🎜🎜##🎜 🎜#
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!