En Java, tout est un objet, et dans un environnement distribué, il est souvent nécessaire de passer un objet d'un extrémité du réseau ou de l'appareil à l'autre extrémité. Cela nécessite un protocole qui peut transmettre des données aux deux extrémités. Le mécanisme de sérialisation Java est créé pour résoudre ce problème.
Après avoir converti l'état d'objet en flux d'octets, vous pouvez l'enregistrer dans un fichier à l'aide de classes de différents flux d'octets dans le package java.io, tuyau dans un autre thread ou envoyer des données d'objet à un autre hôte via une connexion réseau. La fonction de sérialisation des objets est très simple et puissante, et elle est utilisée dans RMI, socket, JMS et EJB. Le problème de sérialisation des objets n'est pas le problème le plus central de la programmation réseau, mais il est très important et a de nombreuses significations pratiques.
La sérialisation de l'objet Java conserve non seulement les données d'un objet, mais enregistre également les données de chaque objet référencées par l'objet. L'ensemble de la hiérarchie d'objets peut être écrit dans un flux d'octets, enregistré dans un fichier ou transmis sur une connexion réseau. La sérialisation de l'objet peut être utilisée pour effectuer une «copie profonde» de l'objet, c'est-à-dire en copie l'objet lui-même et l'objet référencé lui-même. La sérialisation d'un objet peut entraîner une séquence de l'objet entier.
Méthode d'utilisation de base:
La sérialisation fait référence à la persistance d'une classe ou d'un type de données de base dans un flux de données, y compris le fichier, le flux d'octets et le flux de données réseau.
L'implémentation de la sérialisation dans Java repose principalement sur deux classes: ObjectOutStream et ObjectInputStream. Ce sont des sous-classes de OutputStream et InputStream dans le système Java IO. Comme ils sont des flux dans Java IO, ils peuvent les faire fonctionner comme des flux. Voici comment ils sont utilisés:
Importer java.io.ByteArrayInputStream; Importer java.io.ByteArrayOutputStream; Importer java.io.ioException; import java.io.objectInputStream; Importer java.io.ObjectOutputStream; import java.io.serializable; La paire de classe publique implémente Serializable {private static final long SerialVersionUID = -1874850715617681161l; Type int privé; nom de chaîne privé; public int getType () {return type; } public void setType (int type) {this.type = type; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public paire (int type, nom de chaîne) {super (); this.type = type; this.name = name; } public static void main (string [] args) lève ioException, classNotFoundException {// TODO Méthode générée automatique Stub // serialize objet paire bytearrayoutputStream bos = new byTearrayoutputStream (); ObjectOutputStream OOS = new ObjectOutputStream (BOS); Paire paire = nouvelle paire (1, "Charlie"); oos.writeObject (paire); // Desérialize objet, obtenez un nouvel objet newpair bytearrayInputStream bis = new ByteArrayInputStream (bos.toByTearray ()); ObjectInputStream oiS = new ObjectInputStream (bis); Paire newpair = (paire) ois.readObject (); System.out.println (newpair.getType () + ":" + newpair.getName ()); }}1. Les deux classes sont dans le motif du décorateur. Lors de leur création, ils doivent passer dans un flux basé sur des octets. Ces flux sont ceux qui stockent vraiment des données sérialisées ci-dessous.
2. La classe persistante doit implémenter l'interface sérialisable. Cette interface n'a aucune fonction, mais n'est qu'une interface de marquage. Si la sérialisation est effectuée sur une seule machine et que les données résultantes sont transmises à une autre machine pour la désérialisation, les classes de ces deux machines devraient être exactement les mêmes, sinon la sérialisation ne réussira pas.
3. N'oubliez pas de ne pas utiliser TOSTRING pour obtenir la chaîne dans le code ci-dessus, puis obtenez le ByteArrayInputStream de cette chaîne, puis désérialisez-la. BOS est stocké en octets. La conversion en chaîne stockée en caractères provoquera inévitablement des changements de données, et l'octet [] tiré de la chaîne ne sera pas l'octet précédent []. J'ai rencontré ce problème parce que je souhaite stocker les données sérialisées dans le fichier XML. Voir un autre article dans ma solution spécifique à ce problème:
www.vevb.com/article/88130.htm
Que fait la machine virtuelle Java lors de la sérialisation et de la désérialisation?
Le mécanisme de sérialisation Java dans la description de ces deux classes est décrit en détail dans Javadoc:
Citation
Le mécanisme de sérialisation par défaut pour un objet écrit la classe de l'objet, la signature de classe et les valeurs de tous les champs non transitoires et non statiques. Les références à d'autres objets (sauf dans les champs transitoires ou statiques) entraînent également l'écriture de ces objets. Plusieurs références à un seul objet sont codées à l'aide d'un mécanisme de partage de référence afin que les graphiques d'objets puissent être restaurés à la même forme que lorsque l'original a été écrit.
Le mécanisme de sérialisation par défaut écrit des données sur le flux comprend:
1. La classe à laquelle appartient l'objet
2. Signature de classe
3. Toutes les propriétés non transitoires et non statiques
4. Les références à d'autres objets entraîneront également la sérialisation de ces objets.
5. Si plusieurs références pointent vers un objet, le mécanisme de référence de partage sera utilisé.
Citation
Les cours qui nécessitent une manipulation spéciale pendant le processus de sérialisation et de désérialisation doivent mettre en œuvre des méthodes spéciales avec ces signatures exactes:
private void readObject (java.io.ObjectInputStream Stream) lève IOException, classNotFoundException; private void writeObject (java.io.objectOutputStream stream) lève ioException private void readObjectNodata () lève objectStreamException;