Articles

comment se passe le processus de désérialisation en Java?

Posted by admin

dans un de mes précédents articles sur « L’implémentation D’une interface sérialisable en java », M. Bitoo a posé une bonne question  » au moment de la désérialisation, comment la JVM crée l’objet sans appeler le constructeur?? ». J « ai pensé à lui répondre dans le même message dans un commentaire, mais à un autre moment, j » ai pensé à ce sujet très intéressant qui nécessite un article détaillé séparé, ainsi qu  » une discussion avec vous les gens., Donc, ici, je commence la discussion avec mes connaissances limitées dans ce sujet et je vous encouragerai tous à mettre vos pensées/requêtes afin de rendre ce sujet clair pour nous tous. Ici je commence.

nous avons déjà couvert beaucoup de choses liées à la sérialisation en java, et certaines choses liées à la désérialisation en java. Je ne vais pas recommencer la même chose et revenir directement au sujet de discussion principal, c’est-à-dire comment la désérialisation fonctionne en Java?

la désérialisation est le processus par lequel l’objet précédemment sérialisé est reconstruit dans sa forme originale, c’est-à-dire, l’instance d’un objet. L’entrée du processus de désérialisation est le flux d’octets que nous obtenons à l’autre extrémité du réseau ou que nous lisons simplement à partir du système de fichiers/de la base de données. Une question se pose immédiatement, qu’est-ce qui est écrit dans ce flux d’octets?

En savoir plus: Mini guide pour implémenter l’interface sérialisable

pour être très précis, ce flux d’octets (ou disons des données sérialisées) contient toutes les informations sur l’instance sérialisée par le processus de sérialisation., Ces informations incluent les métadonnées de la classe, les informations de type des champs d’instance et les valeurs des champs d’instance. Ces mêmes informations sont nécessaires lorsque l’objet est reconstruit dans une nouvelle instance d’objet. Lors de la désérialisation d’un objet, la JVM lit ses métadonnées de classe à partir du flux d’octets qui spécifie si la classe d’un objet implémente une interface « sérialisable » ou « Externalisable ».,

veuillez noter que pour que la désérialisation se produise de manière transparente, le bytecode d’une classe, dont l’objet est désérialisé, doit être présent dans la JVM effectuant la désérialisation. Sinon ‘la ‘ClassNotFoundException’ est levée. Ce n’est pas trop évident ??

Si l’instance implémente l’interface sérialisable, alors une instance de la classe est créée sans appeler son constructeur. Vrai? alors comment l’objet est créé sinon le constructeur est appelé?

regardons le bytecode d’un eprogramme simple:

le bytecode ci-dessus a l’air réel, n’est-ce pas?, Dans notre première ligne, nous allons pousser une valeur de la” table de variables locales  » sur la pile. Dans ce cas, nous ne faisons que pousser la référence implicite à « ceci”, donc ce n’est pas l’instruction la plus excitante. La deuxième instruction est la chose principale. Il invoque en fait le constructeur de la classe super most et dans le cas ci-dessus, c’est Object.Java. Et une fois que le constructeur de la classe super most (C’est-à-dire Object dans ce cas) a été appelé, le reste du code fait des instructions spécifiques écrites en code.

Correspondant au concept ci-dessus c’est à dire, constructeur de super la plupart des classes, nous avons un concept similaire dans la désérialisation. Dans le processus de désérialisation, il est nécessaire que toutes les classes parentes de l’instance soient sérialisables; et si une super classe dans hirarchy n’est pas sérialisable, elle doit avoir un constructeur par défaut. Maintenant, il a du sens. Ainsi, pendant la désérialisation, la classe super most est recherchée en premier jusqu’à ce qu’une classe non sérialisable soit trouvée. Si toutes les super classes sont sérialisables, la JVM finit par atteindre la classe Object elle-même et crée d’abord une instance de classe Object., Si entre la recherche des super classes, n’importe quelle classe est trouvée non sérialisable, son constructeur par défaut sera utilisé pour allouer une instance en mémoire.

si une super classe d’instance doit être désérialisée dans non sérialisable et n’a pas non plus de constructeur par défaut, alors la ‘NotSerializableException‘ est levée par JVM.

de plus, avant de poursuivre la reconstruction de l’objet, la JVM vérifie si le serialVersionUID mentionné dans le flux d’octets correspond au serialVersionUID de la classe de cet objet. S’il ne correspond pas, l’Exception ‘InvalidClassException’ est levée.,

En savoir plus: SerialVersionUID en java et faits rapides connexes

jusqu’à présent, nous avons obtenu l’instance située en mémoire en utilisant l’un des constructeurs par défaut de superclass. Notez qu’après cela, aucun constructeur ne sera appelé pour une classe. Après avoir exécuté super class constructor, JVM lit le flux d’octets et utilise les méta-données de l’instance pour définir les informations de type et d’autres méta-informations de l’instance.,

Après la création de l’instance vide, JVM définit d’abord ses champs statiques, puis appelle la méthode readobject() par défaut en interne, qui est responsable de la définition des valeurs du flux d’octets sur l’instance vide.

En savoir plus: Exemple de code pour readObject() et writeObject ()

Une fois la méthode readObject() terminée, le processus de désérialisation est terminé et vous êtes prêt à travailler avec une nouvelle instance désérialisée.

Leave A Comment