Qu'entend-on par «sérialisation d'objet»? Pouvez-vous l'expliquer avec quelques exemples?
java
serialization
object-serialization
guerrier
la source
la source
Réponses:
La sérialisation est la conversion d'un objet en une série d'octets, de sorte que l'objet peut être facilement enregistré dans un stockage persistant ou diffusé sur une liaison de communication. Le flux d'octets peut ensuite être désérialisé - converti en une réplique de l'objet d'origine.
la source
Vous pouvez considérer la sérialisation comme le processus de conversion d'une instance d'objet en une séquence d'octets (qui peut être binaire ou non selon l'implémentation).
Il est très utile lorsque vous souhaitez transmettre des données d'un objet à travers le réseau, par exemple d'une JVM à une autre.
En Java, le mécanisme de sérialisation est intégré à la plate-forme, mais vous devez implémenter l' interface Serializable pour rendre un objet sérialisable.
Vous pouvez également empêcher la sérialisation de certaines données de votre objet en marquant l'attribut comme transitoire .
Enfin, vous pouvez remplacer le mécanisme par défaut et fournir le vôtre; cela peut convenir dans certains cas particuliers. Pour ce faire, vous utilisez l'une des fonctionnalités cachées de java .
Il est important de noter que ce qui est sérialisé est la "valeur" de l'objet ou du contenu et non la définition de classe. Les méthodes ne sont donc pas sérialisées.
Voici un échantillon très basique avec des commentaires pour faciliter sa lecture:
Lorsque nous exécutons ce programme, le fichier "o.ser" est créé et nous pouvons voir ce qui s'est passé derrière.
Si nous changeons la valeur de: someInteger en, par exemple Integer.MAX_VALUE , nous pouvons comparer la sortie pour voir quelle est la différence.
Voici une capture d'écran montrant précisément cette différence:
Pouvez-vous repérer les différences? ;)
Il existe un champ supplémentaire pertinent dans la sérialisation Java: le serialversionUID mais je suppose que c'est déjà trop long pour le couvrir.
la source
SerializationSample
SerializationSample instance = new SerializationSample();
ensuite la sortie est créée et l'objet écrit dans cette sortie.Oser répondre à la question de 6 ans, en ajoutant juste une compréhension de très haut niveau pour les personnes novices en Java
Conversion d'un objet en octets
Reconversion des octets en un objet (désérialisation).
Quand nous voulons persister l'objet. Lorsque nous voulons que l'objet existe au-delà de la durée de vie de la JVM.
ATM: lorsque le titulaire du compte essaie de retirer de l'argent du serveur via ATM, les informations du titulaire du compte, telles que les détails du retrait, seront sérialisées et envoyées au serveur où les détails sont désérialisés et utilisés pour effectuer des opérations.
Implémenter l'
java.io.Serializable
interface (interface marqueur donc pas de méthode à implémenter).Persister l'objet: utilisez la
java.io.ObjectOutputStream
classe, un flux de filtre qui est un wrapper autour d'un flux d'octets de niveau inférieur (pour écrire un objet dans des systèmes de fichiers ou transférer un objet aplati sur un câble réseau et reconstruit de l'autre côté).writeObject(<<instance>>)
- écrire un objetreadObject()
- pour lire un objet sérialiséLorsque vous sérialisez un objet, seul l'état de l'objet est enregistré, pas le fichier de classe ou les méthodes de l'objet.
Lorsque vous sérialisez un objet de 2 octets, vous voyez un fichier sérialisé de 51 octets.
Réponse pour: Comment s'est-il converti en fichier de 51 octets?
java.lang.Object
.Edit : Un autre bon lien à lire.
Cela répondra à quelques questions fréquentes:
Comment ne sérialiser aucun champ en classe.
Rép: utilisez un mot-clé transitoire
Lorsque la classe enfant est sérialisée, la classe parent est-elle sérialisée?
Rép: Non, si un parent n'étend pas le champ des parents de l'interface sérialisable, ne soyez pas sérialisé.
Lorsqu'un parent est sérialisé, la classe enfant est-elle sérialisée?
Réponse: Oui, par défaut, la classe enfant est également sérialisée.
Comment éviter que la classe enfant ne soit sérialisée?
Rép: a. Substituez la méthode et le lancer writeObject et readObject
NotSerializableException
.b. vous pouvez également marquer tous les champs transitoires dans la classe enfant.
la source
La sérialisation consiste à prendre un objet "vivant" en mémoire et à le convertir dans un format qui peut être stocké quelque part (par exemple en mémoire, sur disque) et plus tard "désérialisé" en un objet vivant.
la source
J'ai aimé la façon dont @OscarRyz présente. Bien qu'ici, je continue l' histoire de la sérialisation qui a été à l'origine écrite par @amitgupta.
Même si connaître la structure des classes de robots et avoir des données sérialisées, le scientifique de la Terre n'a pas pu désérialiser les données qui peuvent faire fonctionner les robots.
Les scientifiques de Mars attendaient le paiement complet. Une fois le paiement effectué, les scientifiques de Mars ont partagé le serialversionUID avec les scientifiques de la Terre. Le scientifique de la Terre l'a mis en classe de robot et tout s'est bien passé.
la source
La sérialisation signifie des objets persistants en java. Si vous souhaitez enregistrer l'état de l'objet et reconstruire l'état ultérieurement (peut-être dans une autre JVM), la sérialisation peut être utilisée.
Notez que les propriétés d'un objet ne seront enregistrées que. Si vous souhaitez ressusciter l'objet à nouveau, vous devez avoir le fichier de classe, car seules les variables membres seront stockées et non les fonctions membres.
par exemple:
Le Searializable est une interface de marqueur qui indique que votre classe est sérialisable. L'interface de marqueur signifie qu'il s'agit simplement d'une interface vide et l'utilisation de cette interface informera la machine virtuelle Java que cette classe peut être rendue sérialisable.
la source
Mes deux cents de mon propre blog:
Voici une explication détaillée de la sérialisation : (mon propre blog)
Sérialisation:
La sérialisation est le processus de persistance de l'état d'un objet. Il est représenté et stocké sous la forme d'une séquence d'octets. Cela peut être stocké dans un fichier. Le processus pour lire l'état de l'objet à partir du fichier et le restaurer est appelé désérialisation.
Quel est le besoin de sérialisation?
Dans l'architecture moderne, il est toujours nécessaire de stocker l'état de l'objet, puis de le récupérer. Par exemple, dans Hibernate, pour stocker un objet, nous devons rendre la classe Serializable. Ce qu'il fait, c'est qu'une fois que l'état de l'objet est enregistré sous forme d'octets, il peut être transféré vers un autre système qui peut alors lire l'état et récupérer la classe. L'état de l'objet peut provenir d'une base de données ou d'un jvm différent ou d'un composant distinct. Avec l'aide de la sérialisation, nous pouvons récupérer l'état de l'objet.
Exemple de code et explication:
Voyons d'abord la classe d'objets:
Dans le code ci-dessus, on peut voir que la classe Item implémente Serializable .
Il s'agit de l'interface qui permet à une classe d'être sérialisable.
Maintenant, nous pouvons voir qu'une variable appelée serialVersionUID est initialisée en variable Long. Ce nombre est calculé par le compilateur en fonction de l'état de la classe et des attributs de classe. C'est le nombre qui aidera le jvm à identifier l'état d'un objet lorsqu'il lit l'état de l'objet à partir d'un fichier.
Pour cela, nous pouvons consulter la documentation Oracle officielle:
Si vous avez remarqué qu'il existe un autre mot-clé que nous avons utilisé, qui est transitoire .
Si un champ n'est pas sérialisable, il doit être marqué comme transitoire. Ici, nous avons marqué le itemCostPrice comme transitoire et ne voulons pas qu'il soit écrit dans un fichier
Voyons maintenant comment écrire l'état d'un objet dans le fichier, puis le lire à partir de là.
Dans ce qui précède, nous pouvons voir un exemple de sérialisation et de désérialisation d'un objet.
Pour cela, nous avons utilisé deux classes. Pour sérialiser l'objet, nous avons utilisé ObjectOutputStream. Nous avons utilisé la méthode writeObject pour écrire l'objet dans le fichier.
Pour la désérialisation, nous avons utilisé ObjectInputStream qui lit à partir de l'objet à partir du fichier. Il utilise readObject pour lire les données d'objet du fichier.
La sortie du code ci-dessus serait comme:
Notez que itemCostPrice de l'objet désérialisé est nul car il n'a pas été écrit.
Nous avons déjà discuté des bases de la sérialisation Java dans la partie I de cet article.
Maintenant, discutons-en profondément et comment cela fonctionne.
Commençons d'abord par le serialversionuid.
Le serialVersionUID est utilisé comme contrôle de version dans une classe Serializable.
Si vous ne déclarez pas explicitement un serialVersionUID, JVM le fera automatiquement pour vous, en fonction des différentes propriétés de la classe Serializable.
Algorithme de Java de calcul de serialversionuid (Lire plus de détails ici)
Algorithme de sérialisation Java
Choses à garder à l'esprit:
Les champs statiques d'une classe ne peuvent pas être sérialisés.
Si le serialversionuid est différent dans la classe read, il lèvera une
InvalidClassException
exception.Si une classe implémente sérialisable, toutes ses sous-classes seront également sérialisables.
Si une classe a une référence d'une autre classe, toutes les références doivent être sérialisables sinon le processus de sérialisation ne sera pas effectué. Dans ce cas, NotSerializableException est levée lors de l'exécution.
Par exemple:
la source
serialVersionUID
est différent, il lancera unInvalidClassException
, pas unClassCastException
. Il n'est pas nécessaire de gaspiller tout cet espace en spécifiant leserialVersionUID
calcul. La documentation est citée, en longueur excessive, mais n'est pas liée ou correctement citée. Trop de peluches ici et trop d'erreurs.La sérialisation est le processus de conversion de l'état d'un objet en bits afin qu'il puisse être stocké sur un disque dur. Lorsque vous désérialisez le même objet, il conservera son état ultérieurement. Il vous permet de recréer des objets sans avoir à enregistrer les propriétés des objets à la main.
http://en.wikipedia.org/wiki/Serialization
la source
Sérialisation d'objets Java
Serialization
est un mécanisme pour transformer un graphe d'objets Java en un tableau d'octets pour le stockage (to disk file
) ou la transmission (across a network
), puis en utilisant la désérialisation, nous pouvons restaurer le graphe des objets. Les graphiques des objets sont correctement restaurés à l'aide d'un mécanisme de partage de référence. Mais avant de stocker, vérifiez si serialVersionUID du fichier d'entrée / réseau et le fichier .class serialVersionUID sont identiques. Sinon, lancez ajava.io.InvalidClassException
.serialVersionUID est essentiel au processus de sérialisation. Mais il est facultatif pour le développeur de l'ajouter dans le fichier source java. Si un serialVersionUID n'est pas inclus, le runtime de sérialisation générera un serialVersionUID et l'associera à la classe. L'objet sérialisé contiendra ce serialVersionUID avec d'autres données.
Remarque - Il est fortement recommandé que toutes les classes sérialisables déclarent explicitement un serialVersionUID
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
, et peuvent ainsi entraîner des conflits de serialVersionUID inattendus pendant la désérialisation, entraînant l'échec de la désérialisation.Inspection des classes sérialisables
Une classe doit implémenter l' interface java.io.Serializable afin de sérialiser son objet avec succès. Serializable est une interface de marqueur et utilisée pour informer le compilateur que la classe qui l'implémente doit être ajoutée au comportement sérialisable. Ici, Java Virtual Machine (JVM) est responsable de sa sérialisation automatique.
L'implémentation de l'interface externalisable permet à l'objet d'assumer un contrôle complet sur le contenu et le format du formulaire sérialisé de l'objet. Les méthodes de l'interface Externalizable, writeExternal et readExternal, sont appelées pour enregistrer et restaurer l'état des objets. Lorsqu'elles sont implémentées par une classe, elles peuvent écrire et lire leur propre état en utilisant toutes les méthodes d'ObjectOutput et ObjectInput. Il est de la responsabilité des objets de gérer les versions qui se produisent.
Seuls les objets qui prennent en charge l'interface java.io.Serializable ou java.io.Externalizable peuvent être
written to
/read from
streams. La classe de chaque objet sérialisable est codée, y compris le nom de classe et la signature de la classe, les valeurs des champs et des tableaux de l'objet, et la fermeture de tout autre objet référencé à partir des objets initiaux.Exemple sérialisable pour les fichiers
Exemple sérialisable sur réseau
Distribuer l'état de l'objet dans différents espaces d'adressage, soit dans différents processus sur le même ordinateur, soit même dans plusieurs ordinateurs connectés via un réseau, mais qui fonctionnent ensemble en partageant des données et en invoquant des méthodes.
@voir
la source
JVM to JVM
La sérialisation est le processus d'enregistrement d'un objet sur un support de stockage (tel qu'un fichier ou un tampon de mémoire) ou de le transmettre sur une connexion réseau sous forme binaire. Les objets sérialisés sont indépendants de la JVM et peuvent être re-sérialisés par n'importe quelle JVM. Dans ce cas, l'état des objets java "en mémoire" est converti en un flux d'octets. Ce type de fichier ne peut pas être compris par l'utilisateur. Il s'agit d'un type particulier d'objet c'est-à-dire réutilisé par la JVM (Java Virtual Machine). Ce processus de sérialisation d'un objet est également appelé dégonflage ou triage d'un objet.
L'objet à sérialiser doit implémenter
java.io.Serializable
Interface. Le mécanisme de sérialisation par défaut d'un objet écrit la classe de l'objet, la signature de classe et les valeurs de tous les champs non transitoires et non statiques.ObjectOutput
interface étend l'DataOutput
interface et ajoute des méthodes pour sérialiser des objets et écrire des octets dans le fichier. L' interfaceObjectOutputStream
étendjava.io.OutputStream
et implémenteObjectOutput
. Il sérialise des objets, des tableaux et d'autres valeurs dans un flux. Ainsi le constructeur deObjectOutputStream
s'écrit:Le code ci-dessus a été utilisé pour créer l'instance de la
ObjectOutput
classe avec leObjectOutputStream( )
constructeur qui prend l'instance de laFileOuputStream
comme paramètre.L'
ObjectOutput
interface est utilisée en implémentant laObjectOutputStream
classe. LeObjectOutputStream
est construit pour sérialiser l'objet.Désérialisation d'un objet en Java
L'opération opposée de la sérialisation est appelée désérialisation, c'est-à-dire que l'extraction des données d'une série d'octets est appelée désérialisation, ce qui est également appelé gonflement ou dé-marshalling.
ObjectInputStream
étendjava.io.InputStream
et implémente l'ObjectInput
interface. Il désérialise les objets, les tableaux et autres valeurs d'un flux d'entrée. Ainsi le constructeur deObjectInputStream
s'écrit:Le code ci-dessus du programme crée l'instance de la
ObjectInputStream
classe pour désérialiser ce fichier qui avait été sérialisé par laObjectInputStream
classe. Le code ci-dessus crée l'instance en utilisant l'instance de laFileInputStream
classe qui contient l'objet fichier spécifié qui doit être désérialisé car leObjectInputStream()
constructeur a besoin du flux d'entrée.la source
La sérialisation est le processus de transformation d'un objet Java en tableau d'octets, puis de nouveau en objet avec son état préservé. Utile pour diverses choses comme l'envoi d'objets sur le réseau ou la mise en cache de choses sur le disque.
Lisez la suite de ce court article qui explique assez bien la programmation d'une partie du processus , puis passez à javadoc sérialisable . Vous pouvez également être intéressé par la lecture de cette question connexe .
la source
Renvoyez le fichier en tant qu'objet: http://www.tutorialspoint.com/java/java_serialization.htm
la source
| * | Sérialisation d'une classe: conversion d'un objet en octets et octets en objet (désérialisation).
| => La sérialisation d'objets est un processus de conversion de l'état d'un objet en vapeur d'octets.
| => Object-Deserialization est le processus d'obtention de l'état d'un objet et de le stocker dans un objet (java.lang.Object).
& nbsp & nbspSi vous ne lancez pas java.io.InvalidClassException.
| => Un objet Java n'est sérialisable que si sa classe ou l'une de ses superclasses
| => Les champs statiques d'une classe ne peuvent pas être sérialisés.
| => Si vous ne voulez pas sérialiser une variable d'une classe, utilisez un mot-clé transitoire
| => Si une classe implémente sérialisable, toutes ses sous-classes seront également sérialisables.
| => Si une classe a une référence d'une autre classe, toutes les références doivent être sérialisables sinon le processus de sérialisation ne sera pas effectué. Dans ce cas,
NotSerializableException est levée lors de l'exécution.
la source
Je proposerai une analogie pour aider potentiellement à solidifier le but conceptuel / l'aspect pratique de la sérialisation / désérialisation d' objets .
J'imagine la sérialisation / désérialisation d'un objet dans le contexte d'une tentative de déplacement d'un objet à travers un égout pluvial. L'objet est essentiellement "décomposé" ou sérialisé en des versions plus modulaires de lui-même - dans ce cas, une série d'octets - afin d'être effectivement autorisé à passer à travers un support. Dans un sens informatique, nous pourrions voir le chemin parcouru par les octets à travers le collecteur d'orage comme étant semblable aux octets voyageant à travers un réseau. Nous transmutons notre objet afin de nous conformer à un mode de transport ou un format plus souhaitable. L'objet sérialisé sera généralement stocké dans un fichier binaire qui pourra être lu ultérieurement, écrit dans ou les deux.
Peut-être qu'une fois que notre objet sera capable de glisser à travers le drain sous la forme d'une série d'octets décomposés, nous pourrions souhaiter stocker cette représentation de l'objet sous forme de données binaires dans une base de données ou un disque dur. Le principal point à retenir cependant, c'est qu'avec la sérialisation / désérialisation, nous avons la possibilité de laisser notre objet rester dans sa forme binaire après avoir été sérialisé, ou de "récupérer" la forme originale de l'objet en effectuant la désérialisation.
la source