Quel est le but de la sérialisation en Java?

105

J'ai lu un certain nombre d'articles sur la sérialisation et comment c'est si beau et génial mais aucun des arguments n'était assez convaincant. Je me demande si quelqu'un peut vraiment me dire ce que nous pouvons vraiment réaliser en sérialisant une classe?

m_a_khan
la source
10
Qu'est-ce qui n'a pas été convaincant dans leurs arguments? Et pourquoi n'avez-vous pas accepté de réponses à vos questions?
Anon.
8
Il "n'était pas convaincu" qu'ils répondaient à ses questions.
Anthony Forloney
5
Les réponses fournies étaient, en fait, correctes. S'ils ne fonctionnent pas pour vous, répondez-leur sous forme de commentaires et essayez de résoudre le problème au lieu de simplement les ignorer, puis de commencer à enflammer les autres lorsqu'ils soulignent que vous n'utilisez pas SO correctement.
Anon.
4
Anon contribue à la qualité du site en décourageant les questions en double. C'est ridicule de voir cinq questions distinctes qui demandent toutes la même chose. Si vous ne pouvez pas obtenir de réponse, c'est parfois comme ça. Si vous obtenez une réponse mais que cela ne semble pas fonctionner, continuez la discussion dans les commentaires. SO n'est pas une boîte magique qui vous donnera comme par magie une réponse si vous posez simplement la bonne question, ou posez suffisamment de fois, ou attirez l'attention du bon expert.
Chris
1
Soit: (Acceptez la réponse) ou (Postez un commentaire et / ou modifiez la question en expliquant pourquoi ce n'est pas ce dont vous avez besoin).
Anon.

Réponses:

182

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 l'objet et l'état interne de l'objet. Ce tableau d'octets peut ensuite être utilisé entre les JVM exécutant le même code pour transmettre / lire l'objet.

Pourquoi voudrions-nous faire cela?

Il y a plusieurs raisons:

  • Communication: Si vous avez deux machines exécutant le même code et qu'elles ont besoin de communiquer, un moyen simple est pour une machine de créer un objet avec les informations qu'elle aimerait transmettre, puis de sérialiser cet objet à l'autre machine. Ce n'est pas la meilleure méthode de communication, mais elle fait le travail.

  • Persistance: si vous souhaitez stocker l'état d'une opération particulière dans une base de données, elle peut être facilement sérialisée dans un tableau d'octets et stockée dans la base de données pour une récupération ultérieure.

  • Copie profonde: Si vous avez besoin d' une exacte réplique d'un objet et que vous ne voulez pas vous donner la peine d'écrire votre propre classe clone () spécialisée, il suffit de sérialiser l'objet dans un tableau d'octets, puis de le désérialiser vers un autre l'objet atteint cet objectif.

  • Mise en cache: vraiment juste une application de ce qui précède, mais parfois un objet prend 10 minutes à construire, mais ne prendrait que 10 secondes à 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 lorsque cela est nécessaire.

  • Synchronisation croisée entre JVM: la sérialisation fonctionne sur différentes JVM pouvant être exécutées sur différentes architectures.

Schmelter
la source
62
Que diable prend 10 minutes à construire?
oxbow_lakes
2
Mon point étant (bien sûr) que les E / S de fichier impliquées dans la sérialisation éclipseront probablement toute surcharge de création d'objets purs. Je suppose que vous parlez peut-être de quelque chose de très coûteux en calcul, comme la modélisation scientifique, mais la sérialisation est un mécanisme très médiocre pour la persistance car il est difficile de gérer les changements de schéma
oxbow_lakes
11
@oxbow_lakes Un exemple pourrait être si vous maintenez un index d'un ensemble particulier de données pour une recherche rapide. Un index comme celui-ci peut prendre un temps très long à construire, mais une fois que vous l'avez construit, il peut être sérialisé / désérialisé relativement rapidement.
David
Si la demande de l'application Web doit passer par chaque routeur du globe avant d'atteindre la destination, construire l'objet, revenir avec l'objet en utilisant le chemin le plus long possible, Oui, cela peut prendre 10 minutes.
Vaibs
@Schmelter, Puisque vous mentionnez que la sérialisation n'est pas la meilleure méthode de communication, quelle est la meilleure méthode à mettre en œuvre alors?
Ashfaque Rifaye
58

Pendant que vous exécutez votre application, tous ses objets sont stockés en mémoire (RAM). Lorsque vous quittez, 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 remédie à ce problème en laissant votre application enregistrer les objets sur le disque afin qu'elle puisse les relire au prochain démarrage. Si votre application doit fournir un moyen d'enregistrer / partager un état précédent, vous aurez besoin d'une forme de sérialisation.

Gordon Gustafson
la source
2
Donc, il semble que ce soit juste un moyen meilleur et plus efficace d'écrire des données dans un fichier et de le relire en cas de besoin?
m_a_khan
1
C'est la seule vraie explication. Je ne peux penser à aucune autre application réelle de sérialisation +1
Emily
Court et doux. Explication parfaite.
Yakhoob
21

Je peux partager mon histoire et j'espère qu'elle donnera quelques idées sur les raisons pour lesquelles la sérialisation est nécessaire. Cependant, les réponses à votre question sont déjà remarquablement détaillées.

J'avais plusieurs projets qui devaient charger et lire un tas de fichiers texte. Les fichiers contenaient des mots vides, des verbes biomédicaux, des abréviations biomédicales, des mots liés sémantiquement les uns aux autres, etc. Le contenu de ces fichiers est simple: des mots !

Maintenant, pour chaque projet, j'avais besoin de lire les mots de chacun de ces fichiers et de les mettre dans différents tableaux; comme le contenu du fichier n'a jamais changé, il est devenu une tâche courante, quoique 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 et pour les projets ultérieurs, je les ai simplement désérialisés. Je n'ai pas eu à lire les fichiers et à remplir les tableaux encore et encore.

Shams Rushdi
la source
1
Dans un tel cas, pourquoi vous devez les stocker dans un flux de tableau d'octets (en utilisant sérialiser), cela pourrait-il être plus simple que d'utiliser simplement un champ temporaire?
kidnan1991
3

En essence :

La sérialisation est le processus de conversion d'un ensemble d'instances d'objets contenant des références les unes aux autres en un flux linéaire d'octets, qui peuvent ensuite être envoyés via une socket, stockés dans un fichier ou simplement manipulés comme un flux de données

Voir les utilisations de Wiki :

La sérialisation présente un certain nombre d'avantages. Il offre:

  1. une méthode de persistance d'objets qui est plus pratique que d'écrire leurs propriétés dans un fichier texte sur le disque et de les réassembler en les relisant.
  2. une méthode pour émettre des appels de procédure à distance, par exemple, comme dans SOAP
  3. une méthode de distribution d'objets, en particulier dans les composants logiciels tels que COM, CORBA, etc.
  4. une méthode pour détecter les changements de données variant dans le temps.
bassin
la source
1

Le plus évident est que vous pouvez transmettre la classe sérialisée sur un réseau, et le destinataire peut construire un duplicata de l'instance d'origine. 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, vous pouvez donc sérialiser une structure de données hétérogène entière dans un seul foop, si vous le souhaitez.

ddyer
la source
0

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 le temps, ils peuvent survivre à la JVM qui les a créés.

Parfois, cela est utile.

David Soroko
la source
Ceci peut être réalisé avec un simple fichier contenant également du texte. Il est un peu plus facile de relire un objet sérialisé que de lire l'état de l'objet écrit dans un fichier texte, n'est-ce pas?
m_a_khan
@m_a_khan: Wow. Oui, cela peut être fait avec un simple texte. Mais dès que les objets deviennent plus complexes, ou que leurs structures (composition, héritage) deviennent plus complexes, il deviendra un problème de (dé) marshaller manuellement. Imaginez avoir des listes, des ensembles et des cartes comme membres d'objet.
Dirk Schumacher le
Il est facile de proposer différents schémas de sérialisation et il en existe en effet beaucoup. Pour de très bonnes raisons, aucune d'elles ne débouche sur le cas général, dans un "simple texte"
David Soroko
0

J'utilise des objets sérialisés pour standardiser les arguments que je passe aux fonctions ou aux constructeurs de classes. Passer un bean sérialisé est beaucoup plus propre qu'une longue liste d'arguments. Le résultat est un code plus facile à lire et à déboguer.

Ron Norman
la source
1
À mon avis, la searialisation et l'utilisation d'un seul objet de configuration comme paramètre sont assez orthogonales. Ce n'est probablement pas un cas d'utilisation typique.
Gábor Bakos
0

Dans le simple but d'apprendre (remarquez, j'ai dit apprendre, je n'ai pas dit mieux, ni même bien, mais juste pour comprendre les choses), vous pouvez enregistrer vos données dans un fichier texte sur l'ordinateur, puis avoir un programme qui lit ces informations, et en fonction du fichier, vous pouvez faire en sorte que votre programme réponde différemment. Si vous étiez plus avancé, ce ne serait pas nécessairement 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 à un ordinateur espagnol en espagnol, plutôt que de lui dire quelque chose en français, en le forçant à apprendre le français, puis à sauvegarder des choses dans son espagnol natal en traduisant tout. Ce n'est pas la réponse la plus technologique, j'essaie simplement de créer un exemple compréhensible dans un format de langue 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 comme des primitives sur la pile. Vitesse, vitesse, vitesse. Et moins de traitement de fichiers du point de vue du programmeur.

JCoder
la source
En essayant de mettre les choses en anglais simple, vous n'avez pas vraiment expliqué la sérialisation de manière utile.
user3516726