JavaRush /Blog Java /Random-FR /En réponse à l'article « Pourquoi utiliser SerialVersionU...
Сергей
Niveau 31
Киев

En réponse à l'article « Pourquoi utiliser SerialVersionUID dans la classe Serialisable en Java »

Publié dans le groupe Random-FR
Donc... Nous avons une classe que nous voulons sérialiser en utilisant des méthodes conventionnelles (nous utilisons Serializable) En réponse à l'article "Pourquoi utiliser SerialVersionUID dans la classe Serialisable en Java" - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
Nous écrivons une application de test. Je dirai tout de suite que mon objectif est de montrer quoi serialVersionUID.
package Serialization;

import java.io.*;

public class MainSerializable {
    final static String FILE_NAME = "c:\\File.dat";

    public static void serialize(Object object) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(object);

        fileOutputStream.close();
        objectOutputStream.close();
    }

    public static Object deserialize() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(FILE_NAME);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Object object = objectInputStream.readObject();

        objectInputStream.close();

        return object;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerializableClass serializableClass = new SerializableClass();

        serialize(serializableClass);

        SerializableClass newObject = (SerializableClass) deserialize();
    }
}
Tout fonctionne très bien. La classe est sérialisée dans un fichier FILE_NAME = "c:\\File.dat". Il commençait à faire nuit... :) J'ai oublié d'ajouter des champs à la classe. Ajouter:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
Tout semble bien se passer.. tout se compile.. Alors on l'exécute main, on désérialise la classe SerializableClassdu fichier c:\\File.dat" :
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
Oh... Que faire...
Exception in thread "main" java.io.InvalidClassException: Serialization.SerializableClass; local class incompatible: stream classdesc serialVersionUID = 8129437039424566964, local class serialVersionUID = -8271479231760195917
	at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1903)
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
	at Serialization.MainSerializable.deserialize(MainSerializable.java:22)
	at Serialization.MainSerializable.main(MainSerializable.java:30)
En général, tout est juste. La classe a changé et son serialVersionUID= -8271479231760195917, et sérialisée dans le fichier serialVersionUID= 8129437039424566964. Que faire maintenant, que faire ? Comment créer une instance ? Il y a une sortie. Nous devons déclarer dans notre classe : static final long serialVersionUID, ce qui est égal à serialVersionUIDla classe :) grisée dans le fichier. Ceux. nous avons dit, allez-y, je vais désérialiser.. vous pouvez.. vos versions sont les mêmes :
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    static final long serialVersionUID = 8129437039424566964L;

    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
}
On lance... Et.. Tout fonctionne. D'après ce que j'ai compris, cette erreur aurait pu être évitée si la classe avait déclaré à l'avance :
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
Ceux. nous ne laissons pas Java faire ses propres calculs serialVersionUIDbasés sur ses algorithmes (algorithmes assez complexes). Désormais, chaque fois qu'une classe change, nous serialVersionUID = 1L vérifions :
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
Cela fonctionne.. Et maintenant comme ceci :
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
Oui.. Et alors ?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
Cool... tout continue de fonctionner. J'ai donc terminé mon premier article. Je voulais mettre tout cela dans les commentaires, mais je n'arrivais pas à comprendre les symboles. J'accepterai les critiques et commentaires sobres PS Merci à l'auteur qui m'a inspiré pour faire ces délices.. C'est probablement comme ça qu'ils apprennent :) Bonne chance à tous :)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION