Maison  >  Article  >  Java  >  Comment appliquer la sérialisation et la désérialisation Java

Comment appliquer la sérialisation et la désérialisation Java

PHPz
PHPzavant
2023-04-29 17:37:141359parcourir

    Sérialisation et 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

    序列化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后便得到二进制字节码文件内容

    Comment appliquer la sérialisation et la désérialisation Java

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

    Comment appliquer la sérialisation et la désérialisation 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会报错

    Comment appliquer la sérialisation et la désérialisation Java

    Transient (瞬态变量)

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

    实例理解

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

    La désérialisation Java consiste à convertir une séquence d'octets binaires byte[] en un objet Java Java Object

    API de sérialisation

    Comment appliquer la sérialisation et la désérialisation JavaObjectOutputStream

    Objet de flux de sortie octet, écrit le flux de sortie de l'objet dans le fichier (utilisé en combinaison avec FileOutputStream) # 🎜🎜#

    Instance :

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

    ObjectInputStream

    Objet de flux d'entrée d'octet, désérialise la séquence d'octets binaires dans le fichier (combiné avec FileInputStream)

    Comment appliquer la sérialisation et la désérialisation JavaExemple :

    rrreee#🎜🎜#De plus, ObjectInputStream fournit également la méthode readObject() 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#🎜🎜##🎜🎜#Comment appliquer la sérialisation et la désérialisation Java#🎜🎜##🎜🎜#UnSerializing.java s'exécute sur cette fois, vous obtiendrez le contenu désérialisé du bytecode binaire#🎜🎜##🎜🎜#Comment appliquer la sérialisation et la désérialisation Java#🎜🎜##🎜🎜#serialVersionUID#🎜🎜#
    • #🎜🎜# Chacune des classes sérialisées peut être associé à un numéro de version lors de la sérialisation. Ce numéro de version est l'attribut serialVersionUID #🎜🎜#
    • #🎜🎜#serialVersionUID qui doit être modifié avec le modificateur long final statique. #🎜🎜#
    • #🎜🎜#Si la classe sérialisable ne déclare pas l'attribut SerialVersionUID, Java calculera la valeur SerialVersionUID par défaut en fonction de diverses informations sur la classe lors de la sérialisation. Cependant, les documents officiels d'Oracle le documentent fortement. Il est recommandé que toutes les classes sérialisables déclarent explicitement la valeur SerialVersionUID. /code>La valeur est 1#🎜🎜#rrreee#🎜🎜#Exécutez Seriallessly.java à ce moment pour l'opération de sérialisation#🎜🎜##🎜🎜#Après l'exécution, définissez la valeur de serialVersionUID comme 2—>public static final long serialVersionUID = 2L;, une erreur sera signalée lors de l'exécution de UnSerializing.java#🎜🎜##🎜🎜#Comment appliquer la sérialisation et la désérialisation 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!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer