Question

Si vous avez une instance d'objet A qui fait référence à d'autres objets (par exemple les instances B et C), et que vous sérialisez binaire en un fichier, que se passe-t-il? Avez-vous maintenant des données sérialisées qui incluent A, B et C?

Comment ça marche exactement? Que vais-je obtenir si je désérialise les données? A, B et C ??

(N'hésitez pas à inclure également des explications de travail interne).

Était-ce utile?

La solution

Toutes les références à d'autres objets seront également sérialisées. Si vous désérialisez les données, vous vous retrouverez avec un ensemble complet de ses données, y compris les objets A, B et C., c'est probablement le principal avantage de la sérialisation binaire, par opposition à la sérialisation XML.

Si l'une des autres classes à laquelle votre objet détient une référence n'est pas marqué par le [Serializable] attribut, vous obtiendrez un SerializationException Au moment de l'exécution (dont l'image a été volée sans vergogne sur le Web; les erreurs d'exécution ne ressemblent même plus à ceci dans les versions actuelles de vs):

    Example of an unhandled SerializationException

Plus loin que cela, je ne sais pas vraiment quelles "choses internes" que vous espériez comprendre. Utilisation de la sérialisation réflexion Pour parcourir les champs publics et privés d'objets, les convertir en un flux d'octets, qui sont finalement écrits en flux de données. Pendant la désérialisation, l'inverse se produit: un flux d'octets est lu dans le flux de données, qui est utilisé pour synthétiser une réplique exacte de l'objet, ainsi que des informations de type. Tous les champs de l'objet ont les mêmes valeurs qu'ils tenaient auparavant; Le constructeur est ne pas appelé lorsqu'un objet est désérialisé. La façon la plus simple d'y penser est que vous prenez simplement un instantané de l'objet, que vous pouvez restaurer à son état d'origine à volonté.

La classe qui est responsable de la sérialisation réelle et de la désérialisation est appelée format (elle hérite toujours de la IFormatter interface). Son travail consiste à générer un "graphique d'objet", qui est une arbre généralisée contenant l'objet qui est sérialisé / désérialisé comme racine. Comme mentionné ci-dessus, le formateur utilise la réflexion pour parcourir ce graphique d'objet, sérialisation / désérialisation de toutes les références d'objet contenues par cet objet. Le formateur est également suffisamment intelligent pour savoir ne pas sérialiser un objet dans le graphique plus d'une fois. Si deux références d'objet pointent réellement vers le même objet, cela sera détecté et cet objet ne sera sérialisé qu'une seule fois. Cette logique et autre empêchent l'entrée dans une boucle infinie.

Bien sûr, il est facile d'avoir une bonne compréhension générale du fonctionnement de ce processus. C'est beaucoup Plus difficile d'écrire le code qui l'implémente vous-même. Heureusement, cela a déjà été fait pour vous. Une partie du point du framework .NET est que toute cette logique de sérialisation compliquée est intégrée, vous laissant libre de vous en inquiéter. Je ne prétends pas comprendre tout cela moi-même, et vous n'avez certainement pas besoin de profiter pleinement de la fonctionnalité qu'il offre. Des années d'écriture de tout ce code à la main sont enfin terminées. Vous devriez vous réjouir, plutôt que de vous soucier des détails de la mise en œuvre. :-)

Autres conseils

Tout d'abord, le type de l'objet A doit être marqué avec l'attribut [Serializable]. La sérialisation A sera sérialiser toutes ses données de membres, privées ou publiques, à condition que les types des membres soient également étiquetés avec [sérialisable] (ou pour utiliser votre exemple, à condition que les types de B et C soient marqués [sérialisables]). Les tentatives de sérialisation des données, directement ou indirectement, d'un type qui n'est pas [sérialisable] entraînera une exception.

Un certain nombre de types de .NET intégrés sont déjà marqués comme [sérialisables], y compris System.int32 (int), System.boolean (bool), etc.

Vous pouvez en savoir plus sur la sérialisation .NET ici: http://msdn.microsoft.com/en-us/library/4abbf6k0.aspx.

Les objets mentionnés par l'objet principal doivent également être [sérialisables]. Fournir ainsi que tout se fait automatiquement par le formateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top