Introduction
la Sérialisation est la conversion de l’état d’un objet dans un flux d’octets; la désérialisation fait le contraire. Autrement dit, la sérialisation est la conversion d’un objet Java en un flux statique (séquence) d’octets qui peut ensuite être enregistré dans une base de données ou transféré sur un réseau.
sérialisation et désérialisation
le processus de sérialisation est indépendant de l’instance, c’est-à-dire, les objets peuvent être sérialisés sur une plate-forme et désérialisés sur une autre. Les Classes éligibles à la sérialisation doivent implémenter une interface de marqueur spéciale sérialisable.
ObjectInputStream et ObjectOutputStream sont des classes de haut niveau qui étendent java.io.InputStream et java.io.OutputStream respectivement. ObjectOutputStream peut écrire des types primitifs et des graphiques d’objets dans un OutputStream sous forme de flux d’octets. Ces flux peuvent ensuite être lus à L’aide D’ObjectInputStream.,
la méthode la plus importante dans ObjectOutputStream est:
public final void writeObject(Object o) throws IOException;
qui prend un objet sérialisable et le convertit en une séquence (flux) d’octets. De même, la méthode la plus importante dans ObjectInputStream est:
public final Object readObject() throws IOException, ClassNotFoundException;
qui peut lire un flux d’octets et le reconvertir en objet Java. Cela peut ensuite être renvoyé à l’objet d’origine.
illustrons la sérialisation avec une classe Person. Notez que les champs statiques appartiennent à une classe (par opposition à un objet) et ne sont pas sérialisés., Notez également que nous pouvons utiliser le mot clé transient pour ignorer les champs de classe lors de la sérialisation:
public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}
le test ci-dessous montre un exemple d’enregistrement D’un objet de type Person dans un fichier local puis relire cette valeur dans:
Nous avons utilisé ObjectOutputStream pour enregistrer Le fichier « monfichier.txt » est créé dans le répertoire du projet. Ce fichier est ensuite chargé à L’aide de FileInputStream. ObjectInputStream récupère ce flux et le convertit en un nouvel objet appelé p2.,
Enfin, nous testons l’état de l’objet chargé, et il correspond à l’état de l’objet original.
notez que l’objet chargé doit être explicitement converti en un type Person.
la Sérialisation Java mises en garde
Il y a quelques mises en garde qui concernent la sérialisation en Java.
3.1. Héritage et Composition
Lorsqu’une classe implémente l’interface java.io.Serializable, toutes ses sous-classes sont également sérialisables., Au contraire, lorsqu’un objet est une référence à un autre objet, ces objets doivent implémenter l’interface Serializable séparément, ou bien un NotSerializableException sera générée:
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
Si l’un des champs d’un objet sérialisable consiste en un ensemble d’objets, puis de tous ces objets doivent être sérialisables ainsi, ou bien un NotSerializableException sera levée.
3.2. Version série UID
la JVM associe un numéro de version (long) à chaque classe sérialisable., Il est utilisé pour vérifier que les objets enregistrés et chargés ont les mêmes attributs et sont donc compatibles lors de la sérialisation.
ce nombre peut être généré automatiquement par la plupart deses et est basé sur le nom de la classe, ses attributs et les modificateurs d’accès associés. Toute modification entraîne un nombre différent et peut provoquer une InvalidClassException.
Si une classe serializable ne déclare pas de serialVersionUID, la JVM en générera un automatiquement au moment de l’exécution., Cependant, il est fortement recommandé que chaque classe déclare son serialVersionUID car celui généré dépend du compilateur et peut donc entraîner des InvalidClassExceptions inattendues.
3.3. Sérialisation personnalisée en Java
Java spécifie une manière par défaut de sérialiser les objets. Les classes Java peuvent remplacer ce comportement par défaut. La sérialisation personnalisée peut être particulièrement utile lorsque vous essayez de sérialiser un objet qui possède des attributs non sérialisables., Cela peut être fait en fournissant deux méthodes à l’intérieur de la classe que nous voulons sérialiser:
private void writeObject(ObjectOutputStream out) throws IOException;
et
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
avec ces méthodes, nous pouvons sérialiser ces attributs non sérialisables dans d’autres formes pouvant être sérialisées:
public class Address { private int houseNumber; // setters and getters}
le test unitaire suivant teste cette sérialisation personnalisée:
dans ce code, nous voyons comment enregistrer certains attributs non sérialisables en sérialisant une adresse avec une sérialisation personnalisée. Notez que nous devons marquer les attributs unserializable comme transitoires pour éviter L’Exception NotSerializableException.,
Conclusion
dans ce tutoriel rapide, Nous avons passé en revue la sérialisation Java, discuté des choses importantes à garder à l’esprit et montré comment faire une sérialisation personnalisée.