编程知识 cdmana.com

Sérialisation et désrialisation

Un.、Sérialisation et désrialisation

  • Sérialisation:Le processus de conversion d'un objet en une séquence d'octets est appelé sérialisation d'un objet.
  • Désérialisation:Le processus de restauration d'une séquence d'octets en tant qu'objet est appelé désrialisation de l'objet.

2.、 Quand la sérialisation et la désrialisation sont - elles nécessaires?

Quand nous ne sommes que locaux JVM On y va. Java Exemple, Il n'y a pas besoin de sérialisation ou de désrialisation à ce stade , Mais quand nous avons besoin de persister des objets en mémoire sur le disque , Dans la base de données , Quand nous avons besoin d'interagir avec le Navigateur , Quand nous avons besoin de réaliser RPC Heure, Il est temps de sérialiser et de désérialiser .

Les deux premiers scénarios nécessitent une sérialisation et une désrialisation , Ça nous donne une grande question. ? Lorsque nous interagissons avec un navigateur , Et quand les objets en mémoire sont persistants dans la base de données , Il ne semble pas y avoir de sérialisation ou de désrialisation , Parce qu'aucun de nous ne l'a fait. Serializable Interface, Mais ça marche toujours. .

La conclusion est la suivante: :

Tant que nous persistons ou transférons des objets en mémoire , La sérialisation et la désrialisation sont nécessaires à ce stade .

Justification:

Le serveur n'est vraiment pas utilisé pour interagir avec le Navigateur Serializable Interface??JSON Le format est en fait de convertir un objet en chaîne , Ainsi, le format de données dans lequel le serveur interagit avec le navigateur est en fait une chaîne , Voyons voir. String Type de source :

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
Copier le Code

String Le type implémente Serializable Interface, Et afficher les assignations serialVersionUID Valeur de.

Ensuite, regardons ce qui se passe lorsque l'objet persiste dans la base de données. , Mybatis Dans le fichier de cartographie de base de données insert Code:

<insert id="insertUser" parameterType="com.ycfxhsw.User">
    INSERT INTO t_user(name, age) VALUES (#{name}, #{age})
</insert>
Copier le Code

En fait, nous ne persistons pas l'objet entier dans la base de données , Au lieu de cela, les attributs de l'objet sont persistants dans la base de données , Et ces attributs sont implémentés Serializable Propriétés de base de l'interface .

Trois、Pourquoi réaliser Serializable Interface?

In Java Dans la réalisation de Serializable Après l'interface, JVM Nous aidera à sérialiser et désérialiser , Si nous ne réalisons pas Serializable Interface, Écrivez - vous un code de sérialisation et de désrialisation. .

Quatre、 Pourquoi spécifier serialVersionUID Valeur de?

Si la désignation n'est pas affichée serialVersionUID, JVM Génère automatiquement un serialVersionUID, Puis sérialiser avec les propriétés , Persistance ou transfert réseau .

Lors de la désérialisation,JVM Génère automatiquement une nouvelle version basée sur les propriétés serialVersionUID, Et puis nous avons mis cette nouvelle version serialVersionUID Et les anciennes versions générées lors de la sérialisation serialVersionUID Comparer, La désrialisation réussit si elle est la même , Sinon, une erreur est signalée..

Si l'affichage spécifie serialVersionUID, JVM Une fois sérialisé et désérialisé, un serialVersionUID, Mais la valeur nous montre la valeur spécifiée , De cette façon, les anciennes et les nouvelles versions serialVersionUID C'est tout. .

Dans le développement réel, Ne pas afficher les assignations serialVersionUID Quel est le problème? ? Si notre classe n'est pas modifiée après l'écriture , Bien sûr que non. .

Mais cela n'est pas possible dans le développement réel , Nos classes sont itératives , Une fois la classe modifiée , La désrialisation de l'ancien objet déclenchera une erreur . Donc dans le développement réel, , Nous afficherons tous un serialVersionUID, Peu importe la valeur. , Tant que ça ne change pas. .

Écrivez une instance pour tester :

(1) User Catégorie

  • Ne pas afficher les assignations serialVersionUID.
import java.io.Serializable;
public class User implements Serializable {
    String name;
    Integer age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
	// Omis get/set Méthodes
}
Copier le Code

(2) Catégorie d'essai

  • Sérialisation avancée des lignes , Puis désérialiser .
public class SerializeTest {
    private static File file = new File("D:/Desktop/user.txt");

    private static void serialize(User user) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(user);
        oos.close();
    }

    private static User deserialize() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        return (User) ois.readObject();
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User();
        user.setName(" Weaver ");
        user.setAge(18);
        System.out.println(" Le résultat avant sérialisation est :" + user);

        serialize(user);

        User user1 = deserialize();
        System.out.println(" Le résultat après désérialisation est :" + user1);
    }
}
Copier le Code

Le résultat avant sérialisation est :User{name=' Weaver ', age=18} Le résultat après désérialisation est :User{name=' Weaver ', age=18}

(3) Résultats

  • Annoter d'abord le Code de désrialisation , Exécuter le Code de sérialisation , Et puis User Classe ajouter un attribut sex
public class User implements Serializable {
    String name;
    Integer age;
    String sex;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
	// // Omis get/set Méthodes
}

Copier le Code
  • Annoter le Code de sérialisation pour exécuter le Code de désérialisation , Le résultat final est le suivant::

local class incompatible: stream classdesc serialVersionUID = -8867211101605543804, local class serialVersionUID = 6343365699042275217

Les résultats des erreurs sont générés par sérialisation et désrialisation serialVersionUID Incohérence.

Ensuite, on est là - haut. User Afficher sur la base de la classe pour spécifier un serialVersionUID

private static final long serialVersionUID = 1L;
Copier le Code

Répétez les étapes ci - dessus. , Les résultats des essais sont les suivants::

Le résultat avant sérialisation est :User{name=' Weaver ', age=18} Le résultat après désérialisation est :User{name=' Weaver ', age=18, sex='null'}

Afficher les assignations serialVersionUID Après cela, il résout les problèmes de sérialisation et de désérialisation serialVersionUID Questions incohérentes.

Cinq、Java Autres caractéristiques de la sérialisation

D'abord, la conclusion., Par transient Les attributs modifiés par mot - clé ne sont pas sérialisés , static Les propriétés ne sont pas non plus sérialisées .

Testons cette conclusion. :

(1) User Catégorie

public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private Integer age;
    private transient String sex;
    private static String signature = " Le monde dans tes yeux est ce que tu es. ";

    @Override
    public String toString() {
        return "User{" +
                " + name + '\\'' + ", age=" + age + ", sex='" + sex +'\\'' +
                ", signature='" + signature + '\\'' + '}'; } // Omis get/set Méthodes } Copier le Code

(2) Catégorie d'essai

public class SerializeTest {
    private static File file = new File("D:/Desktop/user.txt");

    private static void serialize(User user) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(user);
        oos.close();
    }

    private static User deserialize() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        return (User) ois.readObject();
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User();
        user.setName(" Weaver ");
        user.setAge(18);
        user.setSex("woman");
        System.out.println(" Le résultat avant sérialisation est :" + user);

        serialize(user);

        User user1 = deserialize();
        System.out.println(" Le résultat après désérialisation est :" + user1);
    }
}
Copier le Code

(3) Résultats

Annoter d'abord le Code de désrialisation , Exécuter le Code de sérialisation , Et modifier User Catégorie signature = “Je ne vois que toi”, Annoter le Code de sérialisation pour exécuter le Code de désérialisation , Le résultat final est le suivant::

Résultats avant sérialisation : User{name=' Weaver ', age=18, sex='woman', signature=' Le monde dans tes yeux est ce que tu es. '}

Résultats après désérialisation : User{name=' Weaver ', age=18, sex='null', signature='Je ne vois que toi'}

Six、static Pourquoi les propriétés ne sont pas sérialisées ?

Parce que la sérialisation est pour les objets ,Et static La propriété existe avant l'objet , Chargement à mesure que la classe est chargée, Pour ne pas être sérialisé .

Voir cette conclusion , Est - ce que quelqu'un va demander , serialVersionUID Aussi. static Modification, Pourquoi serialVersionUID Sera sérialisé ?

En fait... serialVersionUID Propriété non sérialisée , JVM Génère automatiquement un serialVersionUID, Ensuite, Nous afficherons le serialVersionUID Valeur de l'attribut attribuée à la génération automatique serialVersionUID.

版权声明
本文为[Dynasty]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/09/20210914164725479i.html

Scroll to Top