J'ai lu un grand nombre d'articles sur la sérialisation et en quoi c'est si beau et génial, mais aucun des arguments n'était suffisamment convaincant. Je me demande si quelqu'un peut vraiment me dire ce que nous pouvons vraiment accomplir en sérialisant un cours?
Définissons d'abord la sérialisation, puis nous pourrons expliquer pourquoi elle est si utile.
La sérialisation consiste simplement à transformer un objet existant en un tableau d'octets. Ce tableau d'octets représente la classe de l'objet, la version de celui-ci et son état interne. Ce tableau d'octets peut ensuite être utilisé entre des machines JVM exécutant le même code pour transmettre/lire l'objet.
Pourquoi voudrions-nous faire cela?
Il y a plusieurs raisons:
Communication: si deux ordinateurs exécutent le même code et qu'ils ont besoin de communiquer, il est facile pour un ordinateur de créer un objet avec les informations qu'il souhaite transmettre, puis de le sérialiser avec l'autre ordinateur. Ce n'est pas la meilleure méthode de communication, mais le travail est fait.
Persistance: si vous souhaitez stocker l'état d'une opération particulière dans une base de données, celle-ci peut facilement être sérialisée dans un tableau d'octets et stockée dans la base de données pour une extraction ultérieure.
Copie profonde: Si vous avez besoin d'une réplique exacte d'un objet et que vous ne voulez pas vous soucier d'écrire votre propre classe spécialisée clone (), vous devez simplement sérialiser l'objet dans un tableau d'octets, et puis la désérialisation en un autre objet permet d'atteindre cet objectif.
Mise en cache: vraiment une application de ce qui précède, mais parfois, un objet prend 10 minutes à générer, mais ne prend que 10 secondes pour se désérialiser. Ainsi, plutôt que de conserver l’objet géant en mémoire, mettez-le simplement en cache dans un fichier via la sérialisation et lisez-le plus tard, au besoin.
Synchronisation croisée entre JVM: la sérialisation fonctionne sur différentes JVM pouvant être exécutées sur différentes architectures.
Lorsque vous exécutez votre application, tous ses objets sont stockés dans la mémoire (RAM). Lorsque vous quittez l'application, cette mémoire est récupérée par le système d'exploitation et votre programme "oublie" essentiellement tout ce qui s'est passé pendant son exécution. La sérialisation résout ce problème en permettant à votre application de sauvegarder des objets sur le disque afin de pouvoir les relire au prochain démarrage. Si votre application doit fournir un moyen de sauvegarder/partager un état précédent, vous aurez besoin d'une forme de sérialisation.
Je peux partager mon histoire et j'espère que cela donnera quelques idées sur la nécessité de la sérialisation. Cependant, les réponses à votre question sont déjà remarquablement détaillées.
J'ai eu plusieurs projets qui ont besoin de charger et de lire un tas de fichiers texte. Les fichiers contenaient des mots vides, des verbes biomédicaux, des abréviations biomédicales, des mots reliés sémantiquement les uns aux autres, etc. Le contenu de ces fichiers est simple: mots!
Maintenant, pour chaque projet, je devais lire les mots de chacun de ces fichiers et les placer dans différents tableaux; comme le contenu du fichier n'a jamais changé, il est devenu une tâche courante, bien que redondante, après le premier projet.
Donc, ce que j'ai fait, c'est que j'ai créé un objet pour lire chacun de ces fichiers et pour remplir des tableaux individuels (variables d'instance des objets). Ensuite, j'ai sérialisé les objets puis, pour les projets ultérieurs, je les ai simplement désérialisés. Je n'ai pas eu à lire les fichiers et à peupler les tableaux encore et encore.
La sérialisation est le processus de conversion d'un ensemble d'instances d'objet contenant des références les unes aux autres en un flux d'octets linéaire, qui peut ensuite être envoyé via un socket, stocké dans un fichier ou simplement manipulé comme un flux de données.
Voir les utilisations de Wiki :
La sérialisation présente de nombreux avantages. Il offre:
- une méthode de persistance des objets qui est plus pratique que d'écrire leurs propriétés dans un fichier texte sur disque et de les ré-assembler en les lisant de nouveau.
- une méthode pour émettre des appels de procédure distante, par exemple, comme dans SOAP
- un procédé de distribution d'objets, notamment dans des composants logiciels tels que COM, CORBA, etc.
- une méthode pour détecter des changements dans des données variables dans le temps.
Le plus évident est que vous pouvez transmettre la classe sérialisée sur un réseau et que le destinataire peut créer un duplicata de l’instance originale. De même, vous pouvez enregistrer une structure sérialisée dans un système de fichiers.
Notez également que la sérialisation est récursive afin que vous puissiez sérialiser une structure de données hétérogène entière dans un swell foop, si vous le souhaitez.
Dans le seul but d'apprendre (notez, j'ai dit apprendre, je n'ai pas dit le meilleur, ni même le bon, mais juste pour comprendre), vous pouvez enregistrer vos données dans un fichier texte sur l'ordinateur, puis créer un programme. qui lit ces informations, et en fonction du fichier, votre programme pourrait répondre différemment. Si vous étiez plus avancé, il ne serait pas nécessaire que ce soit un fichier txt, mais autre chose.
La sérialisation, d'autre part, met les choses directement en langage informatique. C'est comme si vous disiez quelque chose en espagnol à un ordinateur espagnol, plutôt que de le dire en français, le forçant à apprendre le français, puis sauvegardez les choses dans son espagnol natif en traduisant le tout. Ce n’est pas la réponse la plus technique, j’essaie simplement de créer un exemple compréhensible dans un format de langage commun.
La sérialisation est également plus rapide car, en Java, les objets sont gérés sur le tas et prennent beaucoup plus de temps que s'ils étaient représentés sous forme de primitives sur la pile. Vitesse, vitesse, vitesse. Et moins de traitement de fichier du point de vue du programmeur.
Les objets sérialisés conservent leur état dans l'espace, ils peuvent être transférés sur le réseau, le système de fichiers, etc., et dans le temps, ils peuvent survivre à la JVM qui les a créés.
Parfois, cela est utile.
J'utilise des objets sérialisés pour normaliser les arguments que je transmets aux fonctions ou aux constructeurs de classe. Passer un bean sérialisé est bien plus propre qu'une longue liste d'arguments. Le résultat est un code plus facile à lire et à déboguer.