Java Language Sérialisation de base en Java


Exemple

Qu'est-ce que la sérialisation

La sérialisation est le processus consistant à convertir l'état d'un objet (y compris ses références) en une séquence d'octets, ainsi que le processus de reconstruction de ces octets en un objet actif à une date ultérieure. La sérialisation est utilisée lorsque vous souhaitez conserver l'objet. Il est également utilisé par Java RMI pour transmettre des objets entre JVM, soit en tant qu'arguments dans une invocation de méthode depuis un client vers un serveur, soit en tant que valeurs de retour depuis une invocation de méthode, soit en tant qu'exceptions lancées par des méthodes distantes. En général, la sérialisation est utilisée lorsque nous voulons que l'objet existe au-delà de la durée de vie de la machine virtuelle Java.

java.io.Serializable est une interface de marqueur (sans corps). Il est juste utilisé pour "marquer" les classes Java comme sérialisables.

Le runtime de sérialisation associe à chaque classe sérialisable un numéro de version, appelé serialVersionUID , utilisé lors de la désérialisation pour vérifier que l'expéditeur et le destinataire d'un objet sérialisé ont des classes chargées pour cet objet compatibles avec la sérialisation. Si le récepteur a chargé une classe pour l'objet ayant un serialVersionUID différent de celui de la classe de l'expéditeur correspondant, la désérialisation entraînera une InvalidClassException . Une classe sérialisable peut déclarer explicitement son propre serialVersionUID en déclarant un champ nommé serialVersionUID qui doit être static, final, et de type long :

ANY-ACCESS-MODIFIER static final long serialVersionUID = 1L;

Comment rendre une classe éligible pour la sérialisation

Pour conserver un objet, la classe respective doit implémenter l'interface java.io.Serializable .

import java.io.Serializable;

public class SerialClass implements Serializable {

    private static final long serialVersionUID = 1L;  
    private Date currentTime;
    
    public SerialClass() {
        currentTime = Calendar.getInstance().getTime();
    }

    public Date getCurrentTime() {
        return currentTime;
    }
}

Comment écrire un objet dans un fichier

Maintenant, nous devons écrire cet objet dans un système de fichiers. Nous utilisons java.io.ObjectOutputStream à cette fin.

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;

public class PersistSerialClass {

    public static void main(String [] args) {
        String filename = "time.ser";            
        SerialClass time = new SerialClass(); //We will write this object to file system.
        try {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
            out.writeObject(time); //Write byte stream to file system.
            out.close();
        } catch(IOException ex){
            ex.printStackTrace();
        }
     }
 }

Comment recréer un objet à partir de son état sérialisé

L'objet stocké peut être lu à partir du système de fichiers plus tard en utilisant java.io.ObjectInputStream comme indiqué ci-dessous:

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
import java.io.java.lang.ClassNotFoundException;

 public class ReadSerialClass {

    public static void main(String [] args) {
        String filename = "time.ser";    
        SerialClass time = null;

        try {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
            time = (SerialClass)in.readObject();
            in.close();
        } catch(IOException ex){
            ex.printStackTrace();
        } catch(ClassNotFoundException cnfe){
            cnfe.printStackTrace();
        }
        // print out restored time
        System.out.println("Restored time: " + time.getTime());
     }
 }

La classe sérialisée est sous forme binaire. La désérialisation peut être problématique si la définition de classe change: voir le chapitre Gestion des versions des objets sérialisés de la spécification de sérialisation Java pour plus de détails.

La sérialisation d'un objet sérialise l'ensemble du graphe d'objet dont il est la racine et fonctionne correctement en présence de graphes cycliques. Une méthode reset() est fournie pour forcer ObjectOutputStream à oublier les objets qui ont déjà été sérialisés.

Champs transitoires - Sérialisation