Analyse de l'algorithme de sérialisation Java
La sérialisation est un processus de description d'un objet comme une série d'octets ; la désérialisation est un processus de reconstruction de ces octets en un objet. L'API Java Serialization fournit un mécanisme standard pour gérer la sérialisation des objets. Ici, vous pouvez apprendre comment sérialiser un objet, lorsque la sérialisation est requise, et l'algorithme de sérialisation Java. Nous utilisons un exemple pour démontrer comment les octets après la sérialisation décrivent les informations d'un objet.
Le besoin de sérialisation
En Java, tout est objet. Dans un environnement distribué, il est souvent nécessaire de transférer des objets d'un réseau ou d'un appareil à l'autre. Cela nécessite un protocole capable de transmettre des données aux deux extrémités. Le mécanisme de sérialisation Java a été créé pour résoudre ce problème.
Comment sérialiser un objet
La condition préalable pour qu'un objet soit sérialisable est d'implémenter l'interface Serialisable. L'interface Serialisable n'a pas de méthodes et ressemble plus à un marqueur. Les classes avec cette balise peuvent être traitées par le mécanisme de sérialisation.
100.
Le format de sérialisation de l'objet
À quoi ressemble un objet une fois sérialisé ? Ouvrez le fichier temp.out que nous venons de sérialiser et de sortir l'objet, et affichez-le en hexadécimal. Le contenu doit être le suivant :
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
version d'octet public = 100 ;
nombre d'octets publics = 0 ;
Les deux sont de type octet. En théorie, seuls 2 octets sont nécessaires pour stocker ces deux champs, mais en réalité temp.out occupe 51 octets, ce qui signifie qu'en plus des données, il inclut également d'autres descriptions de l'objet sérialisé.
Algorithme de sérialisation Java
L'algorithme de sérialisation effectue généralement les étapes suivantes :
◆Métadonnées de classe de sortie liées aux instances d'objet.
◆Affiche de manière récursive la description de la classe jusqu'à ce qu'il n'y ait plus de superclasses.
◆Une fois les métadonnées de classe terminées, les valeurs de données réelles de l'instance d'objet sont sorties à partir de la superclasse de niveau supérieur.
◆ Afficher de manière récursive les données d'instance de haut en bas
Illustrons avec un autre exemple qui couvre plus complètement toutes les situations possibles :
la classe contient des implémentations sérialisables{
int contientVersion = 11;
}
la classe publique SerialTest étend les implémentations parentes Serialisable {
version entière = 66 ;
contenir con = nouveau contenir();
public int getVersion() {
version de retour ;
}
public static void main (String args []) lance IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}
Le format sérialisé est le suivant :
CA ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A CA 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
Examinons de plus près ce que représentent ces octets. Pour commencer, voir couleur :
La première étape de l'algorithme de sérialisation consiste à générer une description de la classe associée à l'objet. L'objet affiché dans l'exemple est une instance de la classe SerialTest, donc la description de la classe SerialTest est affichée ensuite. Voir les couleurs :
Ensuite, l'algorithme génère l'un des champs, inversion=66, voir couleur :
Ensuite, l'algorithme génère le domaine suivant, contain con = new contain(); c'est un peu spécial, c'est un objet. Lors de la description des références de type d'objet, vous devez utiliser la notation de signature d'objet standard de la JVM, voir couleur :
.Ensuite, l'algorithme affichera la description de la super classe, qui est la classe Parent. Voir la couleur :
Ensuite, affichez la description du domaine de la classe parent, intparentVersion=100, voir aussi color :
Jusqu’à présent, l’algorithme a généré les descriptions de toutes les classes. L'étape suivante consiste à afficher la valeur réelle de l'objet instance. À ce stade, il part du domaine de la classe parent, voir couleur :
Il existe également des champs de la classe SerialTest :
Les octets qui suivent sont plus intéressants. L'algorithme doit décrire les informations de la classe contain. N'oubliez pas que la classe contain n'a pas encore été décrite.
.Affichez la description de domaine unique de contain, intcontainVersion=11 ;
À ce stade, l'algorithme de sérialisation vérifiera si contain a une superclasse, et si c'est le cas, il la générera.
Enfin, la valeur de domaine réelle de la classe contain est affichée.
OK, nous avons discuté du mécanisme et des principes de la sérialisation Java, et nous espérons que cela sera utile aux étudiants.