Sérialisation en Java : tout ce que vous devez savoir [2022]
Publié: 2021-01-04Avec le boom sans cesse croissant de l'industrie informatique, notre dépendance à l'égard de celle-ci semble augmenter de jour en jour. Cette croissance constante a poussé de nombreux professionnels à adopter des langages de programmation dans le but de rester pertinents au sein de l'industrie. Bien que l'industrie utilise plusieurs langues pour servir ses clients, certaines langues sont plus fréquemment utilisées que d'autres. Java est l'un de ces langages.
Que vous soyez un débutant ou un vétéran, une solide connaissance de Java vous sera utile à chaque tournant de votre parcours logiciel. Comme tout autre langage de programmation, Java contient également son propre programme complet. Il faut pratiquer la langue au quotidien pour s'approprier tous les différents concepts qui rythment la langue. Un de ces concepts qui aide beaucoup les utilisateurs est la pratique de la sérialisation en Java.
Table des matières
introduction
La sérialisation dans le contexte de Java fait référence au processus dans lequel un objet de code Java est systématiquement converti en un flux d'octets. Ceci est fait pour permettre le transfert efficace dudit code objet d'une machine virtuelle Java à une autre. Par la suite, cela permet sa recréation à l'aide de la désérialisation. Nous utilisons la sérialisation pour répondre à plusieurs objectifs. Examinons les plus populaires et les plus pertinentes dans la section ci-dessous.
Pourquoi la sérialisation est-elle utilisée ?
Le phénomène de représentation d'un objet sous la forme d'une séquence d'octets a sa juste part d'utilisation dans le paradigme de la programmation. Lorsque le processus s'étend également à la représentation des données de l'objet, l'utilité augmente plusieurs fois. Voici quelques-unes des utilisations les plus courantes de la sérialisation en Java.
la communication
La sérialisation en Java permet une communication efficace et rapide entre plusieurs systèmes informatiques. Ces unités utilisent la sérialisation et la transmission d'objets pour faciliter le partage et la conception simultanés de divers objets. Par conséquent, cela se traduit également par une exécution fluide. Dans le cas de bases de données volumineuses, la sérialisation permet une approche hautement rationalisée de la gestion des objets.
Mise en cache
La mise en cache, dans un sens plus large, fait référence à la méthode de stockage des informations pour y accéder ultérieurement, en y investissant un minimum de temps. La sérialisation dans Java invite la mise en cache en minimisant le temps consacré à la désérialisation d'un objet volumineux. Il est de notoriété publique que le temps nécessaire à la construction d'un objet est beaucoup plus long que le temps nécessaire à la désérialisation. Par conséquent, la sérialisation aide à optimiser cette consommation de temps en mettant en cache les objets relativement plus grands dans le mélange.

Copie en profondeur
La copie en profondeur en Java fait référence au processus de copie d'objets à partir d'un arbre de manière à ce qu'il ne dépende d'aucune de ses versions antérieures susceptibles d'être soumises à un certain degré de modification. Ce processus de clonage est beaucoup plus facile en adoptant la sérialisation. En sérialisant l'objet dans un tableau d'octets puis en le désérialisant par la suite, l'utilisateur peut obtenir une réplique dudit objet.
Synchronisation entre machines virtuelles Java
Le principal avantage de la pratique de la sérialisation réside dans le fait qu'elle permet à l'utilisateur d'opérer sur différentes JVM. Une fois la sérialisation adoptée, peu importe que ces JVM fonctionnent ou non sur des architectures et des systèmes d'exploitation identiques ou différents.
Persistance
En appliquant la sérialisation à un objet, on peut stocker directement l'état de l'article sans aucun inconvénient. En outre, cela permet également à l'utilisateur de sauvegarder l'état mentionné dans une base de données qui peut être récupérée ultérieurement à tout moment dans le futur.
Lire : Questions et réponses de l'entretien sur la sérialisation Java
Sérialisation d'un objet - Le processus impliqué
Avant de procéder à la sérialisation d'un objet, nous devons d'abord déterminer s'il est sérialisable ou non en premier lieu. Maintenant, comment déterminons-nous cela ? Un objet en Java est sérialisable si et seulement si sa classe ou l'une de ses classes parentes permet l'implémentation de l'interface java.io.Serializable. Les critères sont également remplis si ces classes implémentent également sa sous-interface, qui est java.io.Externalizable.
Comme indiqué ci-dessus, la synchronisation entre JVM est l'une des applications les plus puissantes de l'utilisation de la sérialisation. Lorsque nous sérialisons un objet, nous convertissons l'état de cet objet en un flux d'octets. En conséquence, il nous devient possible de transférer l'objet d'une machine virtuelle Java à une autre. Par conséquent, ce flux d'octets peut également être reconverti dans l'objet d'origine.
Cette conversion est également appelée désérialisation. C'est le processus inverse de la sérialisation dans lequel le flux d'octets d'un objet de l'expéditeur qui a été précédemment sérialisé est recréé à l'extrémité réceptrice.
Avantages de la sérialisation en Java
En discutant des utilisations et des applications de la sérialisation dans les sections précédentes, nous avons déjà mis en lumière ses divers mérites. Il est maintenant temps de les approfondir.
- L'un des avantages les plus importants de la sérialisation est le fait qu'il s'agit d'une fonctionnalité intégrée. Pour implémenter ou exécuter la sérialisation, vous n'avez pas besoin de l'aide d'un logiciel tiers.
- Même pour les utilisateurs débutants qui commencent tout juste à se familiariser, la sérialisation est un processus assez facile à apprendre et à comprendre.
- Souvent, les développeurs issus de différents horizons en programmation obtiennent une expérience tactile lorsqu'ils doivent gérer les nuances d'un nouveau langage. Cependant, dans le cas de la sérialisation, le processus est universel et donc plutôt familier avec tous les développeurs.
- Non seulement il est facile à utiliser et à mettre en œuvre, mais il est également facile à personnaliser.
- Actuellement, il existe un certain nombre de technologies critiques qui utilisent la sérialisation dans leurs opérations. En effet, les flux de données sérialisés prennent en charge le chiffrement, l'authentification, la compression et l'informatique Java sécurisée.
Inconvénients de la sérialisation en Java
Aucun langage de programmation n'est parfait à cent pour cent, et ils ne peuvent pas non plus prétendre l'être. Par conséquent, les concepts et les processus qui les constituent ne sont pas non plus exempts de défauts. Voici quelques-uns des inconvénients généraux associés au processus de sérialisation.
- Certains processus de sérialisation nécessitent également que la désérialisation soit appliquée en tandem. Maintenant, l'inconvénient de l'application de la désérialisation est qu'elle rend les objets fragiles. En conséquence, il n'y a jamais une certitude totale que ledit objet sera désérialisé efficacement.
- Lorsque le processus de sérialisation est invoqué, il provoque la création d'un ensemble de variables transitoires. Ces variables transitoires, lorsqu'elles sont créées, occupent de l'espace mémoire supplémentaire. Cependant, un grand nombre de ces variables transitoires ne parviennent pas à être initialisées car le constructeur n'est pas appelé pendant ces processus. Par la suite, ils finissent par affecter une variante du flux Java standard.
- Malgré toutes ses optimisations de consommation de temps, le processus de sérialisation est de plus en plus inefficace en ce qui concerne l'utilisation de la mémoire.
- Le processus de sérialisation n'offre aucun mécanisme de contrôle de transition pour chaque édition standard de Java. Par conséquent, il n'est pas préférable de l'utiliser en association avec des applications nécessitant un accès parallèle sans l'exigence d'API tierces.
- Lors de l'utilisation de la sérialisation, il faut souvent faire des compromis sur l'obtention d'un contrôle fin pour accéder aux objets.
La sérialisation vue à travers une lentille pratique
Jusqu'à présent, nous avons discuté du processus de sérialisation en tant que concept théorique, y compris ses divers avantages et inconvénients. Il est maintenant temps de plonger dans une discussion qui nous permet de visualiser la sérialisation d'un point de vue pratique et sa mise en œuvre. Voici quelques cas qui nous aident à comprendre la réalisation pratique de la sérialisation.

Doit lire : Propriétés et avantages des JavaBeans : comment devriez-vous les utiliser ?
Sérialisation et héritage
L'héritage en Java est largement défini comme le phénomène dans lequel une classe acquiert ou hérite des méthodes et des champs d'une autre classe. La classe qui hérite des propriétés est appelée sous-classe et la classe dont les propriétés sont héritées est appelée superclasse. Le terme superclasse est également utilisé de manière interchangeable avec la classe de base et la classe parent.
Notre premier cas traite de la sérialisation dans le contexte des superclasses. Généralement, si une superclasse est sérialisable, ses sous-classes peuvent également être considérées comme sérialisables par défaut. Bien sûr, cela n'est vrai que si la superclasse implémente l'interface Serializable. Cependant, il existe également certains cas où la sous-classe peut être sérialisée même si la superclasse n'implémente pas l'interface Serializable.
Cela se produit lorsque la sous-classe parvient à implémenter l'interface sérialisable dans sa seule capacité. Si la superclasse ne parvient pas à implémenter l'interface sérialisable en aucune circonstance, les objets de la sous-classe peuvent être sérialisés manuellement lorsque la sous-classe elle-même implémente l'interface sérialisable.
Parfois, l'utilisateur peut également rencontrer une troisième possibilité. Cette possibilité survient lorsque la superclasse est sérialisable, mais l'utilisateur n'a pas tout à fait besoin d'adopter le processus par rapport à la sous-classe.
Dans de telles situations, il existe des moyens d'empêcher consciemment la sérialisation indésirable de la sous-classe. Cela peut être fait en implémentant les méthodes writeObject() et readObject() dans la sous-classe. Cependant, la mise en œuvre de ces méthodes seules ne suffit pas. Parallèlement à l'écriture de ces méthodes, l'utilisateur doit également s'assurer que lesdites méthodes ne lèvent pas l'exception NotSerializableException de leur implémentation.
Sérialisation à l'aide d'un membre statique
Lorsque le processus de sérialisation est implémenté, il finit par ignorer les membres de champ statiques dans le processus. C'est principalement parce que la sérialisation en tant que procédure se préoccupe en grande partie du dernier état de l'objet en question. Par conséquent, alors que les données associées à une instance spécifique d'une classe sont sérialisées avec succès, le champ de membre statique qui lui est associé ne l'est pas.
Sérialisation par rapport aux documents XML
La sérialisation d'objets Java en XML peut être réalisée de plusieurs manières. Ils sont principalement réalisés à l'aide de XMLEncoder et XMLDecoder. L'objectif principal de la sérialisation d'objets Java en documents XML consiste à tenter de limiter les divers inconvénients inhérents au processus de sérialisation.
L'un des problèmes les plus pertinents dans le processus de sérialisation est que la logique qui enregistre et restaure les objets sérialisés est uniquement basée sur la structure interne des classes constituantes. Il ne prend pas en compte les changements qui peuvent avoir été causés à ces classes dans le temps qui s'écoule entre l'enregistrement de l'objet et sa récupération. Par la suite, cela entraîne l'échec imminent du processus de désérialisation.
La sérialisation pose également des problèmes de version. Cela se produit lorsque l'utilisateur enregistre un objet en utilisant une version de la classe mais tente de désérialiser la même classe en utilisant une version différente ou nouvelle de la classe. Dans ce cas, le processus de désérialisation échoue également.
Ainsi, pour éviter tous ces problèmes, certains utilisateurs préfèrent sérialiser les objets en documents XML plutôt que d'adopter l'approche conventionnelle consistant à les sérialiser au format binaire. De plus, la sérialisation d'objets Java en documents XML garantit également que l'objet devient lisible par l'homme, facilitant ainsi un degré supérieur de commodité.
Paiement : Questions et réponses d'entrevue Java
Comprendre l'interface externalisable
L'interface Externalizable en Java est assez similaire à celle de l'interface de sérialisation. La différence réside dans leurs capacités à proposer une sérialisation personnalisée. L'interface externalisable vous donne la possibilité de choisir les objets que vous souhaitez stocker dans le flux, alors que l'interface de sérialisation ne vous accorde pas le même privilège.
On peut profiter de l'interface externalisable sous java.io. L'interface externalisable fournit également à l'utilisateur deux méthodes. Le premier est le vide public writeExternal(ObjectOutput out) lance IOException. L'autre est le vide public readExternal(ObjectOutput in) lance IOException.
Différence entre la sérialisation et l'externalisation
Outre leurs capacités à offrir une sérialisation personnalisée, certaines autres variables clés distinguent également la sérialisation et l'externalisation. Le segment suivant les examine de plus près.
Mise en œuvre
L'une des principales différences entre les interfaces sérialisables et externalisables réside dans leur implémentation. L'interface externalisable attend de l'utilisateur qu'il mentionne explicitement les objets qu'il souhaite sérialiser. Ce n'est pas le cas lorsqu'il s'agit de l'interface sérialisable. Dans l'interface sérialisable, tous les objets et variables sont sérialisés, sans aucune différenciation, pendant l'exécution.
Méthodes
L'interface externalisable se compose principalement de deux méthodes. Il s'agit de la méthode writeExternal() et de la méthode readExternal(). L'interface sérialisable, en revanche, ne comprend aucune méthode.
Traiter
Lorsque l'on exécute le processus de sérialisation dans l'interface externalisable, on lui accorde le privilège d'une sérialisation personnalisée. Alors que dans l'interface sérialisable, on s'est soumis au processus de sérialisation par défaut.
Rétrocompatibilité et contrôle
L'interface externalisable prend en charge la sérialisation sans aucune réserve au contrôle de version en question. Le seul problème avec cette approche est que l'utilisateur doit être responsable lui-même lors de la sérialisation de la superclasse. Au contraire, l'interface de sérialisation nécessite que la même version des JVM soit présente aux deux extrémités. Cependant, il permet une sérialisation par défaut de tous les objets et classes, y compris la superclasse également.
Constructeur public sans Arg
Lors de la reconstruction de l'objet sérialisé, l'interface d'externalisation nécessite l'utilisation du constructeur public no-arg. Ceci est différent dans le cas de l'interface de sérialisation qui ne nécessite pas explicitement le constructeur no-arg, mais utilise plutôt la réflexion pour reconstruire les objets et les classes sérialisés.
Sérialisation en Java : les controverses
Il existe de nombreuses controverses liées au concept de sérialisation en Java. Beaucoup d'entre eux se préoccupent de la suppression de la sérialisation en tant que procédure en premier lieu. Il est largement admis que les architectes d'Oracle envisagent depuis longtemps de supprimer la sérialisation de Java car ils considèrent qu'il s'agit d'une horrible erreur de 1997.
Selon leurs recherches, les failles dans la conception de la procédure de sérialisation sont telles qu'elles menacent les données elles-mêmes. Dans cette mesure, Mark Reinhold en 1997 a attribué près d'un tiers de toutes les vulnérabilités Java au processus de sérialisation, déclarant même que le quotient pourrait également être confortablement supérieur à cela.

Par conséquent, il est fort possible que la sérialisation en tant que construction soit complètement supprimée ou remplacée des annales de Java dans ses prochaines mises à jour. Cela peut également être dû au fait qu'une majorité d'experts ne considèrent pas la sérialisation comme une option idéaliste que les débutants en Java peuvent implémenter dans leurs projets.
Lisez également : Idées et sujets de projet Java
Obtenez un cours de développement de logiciels dans les meilleures universités du monde. Gagnez des programmes Executive PG, des programmes de certificat avancés ou des programmes de maîtrise pour accélérer votre carrière.
Conclusion
Une discussion et une délibération sur la sérialisation ne peuvent être conclues en faisant la lumière sur quelques-unes de ses meilleures pratiques. En voici quelques-unes que l'utilisateur doit adopter afin de s'assurer la meilleure expérience pour lui-même.
- Pour désigner les champs sérialisables, il faut utiliser la balise javadoc@serial.
- Pour les fichiers qui représentent des objets sérialisés, il est préférable d'utiliser l'extension .ser.
- Normalement, le processus de soumission des champs statiques ou transitoires à la sérialisation par défaut est mal vu.
- Sauf si c'est absolument obligatoire, il faut, en toutes circonstances, essayer d'éviter la sérialisation des classes extensibles.
- Lors de la mise en œuvre de la sérialisation, il faut s'assurer d'éviter que les classes internes ne soient impliquées dans le processus de sérialisation.
Si vous souhaitez en savoir plus sur Java, les OOP et le développement de logiciels à pile complète, consultez le programme Executive PG de upGrad & IIIT-B en développement de logiciels à pile complète qui est conçu pour les professionnels et offre plus de 500 heures de formation rigoureuse, Plus de 9 projets et affectations, statut d'ancien de l'IIIT-B, projets de synthèse pratiques et aide à l'emploi avec les meilleures entreprises
