2009-04-21 8 views
2

Comment fonctionne la sérialisation des objets? Comment objet a été désérialisé et une instance est créée à partir de la date sérialisée sans appel à un constructeur?Sérialisation des objets

+0

http://forum.codecall.net/csharp-tutorials/7918-tutorial-visual-studio-2008-c-serialization.html –

+0

laissez-moi savoir si ce n'est pas votre réponse .. –

Répondre

6

J'ai gardé cette langue de réponse agnostique puisqu'une langue n'a pas été donnée.

Lorsque l'objet est sérialisé, toutes les informations requises pour le reconstruire sont codées de manière à pouvoir être récupérées. Cela inclut généralement le type de l'objet, ainsi que la valeur de toutes les variables d'instance. Lorsque l'objet est désérialisé, une zone en mémoire de la taille correcte est allouée et est remplie à l'aide des informations sérialisées, de sorte que le nouvel objet est identique à l'objet sérialisé.

Le programme en cours d'exécution peut alors se référer à ce nouvel objet en mémoire sans devoir appeler le constructeur.

Il y a beaucoup de petits détails que cela n'explique pas, mais c'est l'idée générale de la sérialisation/désérialisation.

+0

+1 Oui je pense c'est ce à quoi fait référence sa question. – TStamper

0

Parlez-vous de Java? Si c'est le cas, la sérialisation est un mécanisme de création d'objet extralinguel. C'est une porte dérobée qui utilise du code natif pour créer l'objet sans appeler les constructeurs. Par conséquent, lors de la conception d'une classe pour la sérialisabilité, vous devez vous assurer qu'une classe créée par la désérialisation conserve les mêmes invariants (les champs clés étant initialisés) que vous le feriez via le chemin du constructeur. Une troisième façon de créer des objets en Java est le clonage, et des problèmes similaires s'appliquent.

Le clonage et la sérialisation n'interagissent pas bien avec l'utilisation des champs finaux si vous devez définir la valeur de ce champ sur quelque chose de différent de ce qui est retourné par le clonage ou le processus de désérialisation.

«Effective Java» de Josh Bloch comporte quelques chapitres qui expliquent ces problèmes plus en profondeur.

(cette réponse peut appliquer à d'autres langues aussi, mais je ne l'ai utilisé sérialisation en Java)

0

En ce qui concerne .NET: ce n'est pas une réponse définitive ou manuel, et je pourrais être tout à tort ...

La sérialisation .NET doit être séparée en binaire par rapport à d'autres (XML ou un dérivateur XML typiquement). La sérialisation binaire est pour la plupart une boîte noire, mais elle permet à l'objet d'être sérialisé et restauré dans son état actuel. La sérialisation XML ne sérialisait généralement que les champs/propriétés publics d'un objet, sauf si elle était surchargée en ajoutant une implémentation ISerializable personnalisée.

Dans le cas de la sérialisation XML, je crois que .NET utilise Reflection pour déterminer quels champs et propriétés sont convertis en leurs éléments équivalents. L'ajout d'un attribut [XMLSerializable] implémente un comportement par défaut qui peut être ajusté en appliquant d'autres attributs au niveau du champ (tel que [XMLAttribute]). Les métadonnées (dont Reflection dépend) stockent tous les membres de l'objet ainsi que leurs attributs et adresses, ce qui permet au sérialiseur de déterminer comment générer la sortie.

Questions connexes