2009-09-08 11 views
0

XML Serialization from MSDN:sérialisation XML vs réflexion en C#

sérialisés et Désérialise objets dans et à partir de documents XML. Le XmlSerializer vous permet de contrôler comment les objets sont codés en XML.

Reflection from MSDN

réflexion fournit des objets (de type de type ) qui encapsulent les assemblages, les modules et les types . Vous pouvez utiliser réflexion pour créer dynamiquement une instance d'un type, lier le type à un objet existant ou obtenir le type d'un objet existant et invoquer ses méthodes ou accéder à ses champs et propriétés. Si vous utilisez les attributs dans votre code, Reflection vous permet d'y accéder.

Pour autant que je sache, je pourrais créer des objets en cours d'exécution en utilisant XML Serialization? En d'autres termes, disons que j'ai une base de données, je pourrais définir mes "classes" ou "objets" dans quelques tables. Je pourrais alors obtenir le code XML pour les données de l'objet, puis créer l'objet au moment de l'exécution.

Je pourrais également avoir ces objets compilés en tant que bibliothèques facilement disponibles, puis utiliser Reflection pour accéder à ses fonctions. D'après vous, lequel de ces deux concepts accorderait le plus de flexibilité tout en sacrifiant la moindre performance? Points bonus si vous pouvez fournir une explication détaillée avec des considérations et peut-être un échantillon de code.

Répondre

2

La sérialisation et la réflexion ne s'excluent pas mutuellement. Vous pouvez certainement sérialiser et désérialiser un objet et ensuite le modifier en utilisant Reflection.

sérialisation

sérialisation est tout simplement le concept de prendre un « instantané » de l'état d'un objet afin que vous pouvez potentiellement restaurer cet instantané à une date ultérieure.

Si vous souhaitez stocker des objets dans un magasin persistant, la sérialisation est une bonne option si vous n'avez pas besoin de pouvoir interroger après des valeurs particulières.

Notez qu'il existe au moins deux types de sérialisation différents:

  • sérialisation XML, qui représente un objet en XML. Comme c'est du XML, cette représentation est (en théorie au moins) lisible par l'homme et interopérable.
  • Sérialisation binaire, qui stocke et lit simplement un objet sous la forme d'un tableau d'octets. Cette représentation est exclusive et non lisible par l'homme.

réflexion

réflexion est la possibilité d'utiliser des métadonnées d'objet pour manipuler un objet. Vous pouvez, par exemple, décider que vous souhaitez affecter la chaîne "Foo" à toutes les propriétés de chaîne accessibles en écriture d'un objet donné, quel que soit le type d'objet.

Ceci est surtout intéressant lorsque le type d'objet n'est pas connu au moment du design.

0

Pour désérialiser un objet, vous devez connaître le type dans lequel vous souhaitez le désérialiser. Vous ne pouvez donc pas créer simplement des objets à partir de xml sans avoir défini son type dans un assemblage.

Ce que vous pouvez faire est de stocker xml dans votre base de données qui représente des objets sérialisés. Vous pouvez ensuite charger le fichier XML à partir de la base de données et le désérialiser dans les instances d'objet selon les besoins. La source du fichier XML n'a pas besoin d'être un objet sérialisé, vous pouvez donc le créer manuellement si vous en avez besoin. L'utilisation de la réflexion serait une situation différente. Avec la réflexion, vous pouvez prendre un objet et obtenir une liste de la méthode et des propriétés disponibles sur l'objet. Vous pouvez ensuite écrire du code qui a fonctionné dynamiquement avec vos objets, quel que soit le type qu'ils implémentent. Le problème avec cette approche est que le code est maladroit à écrire et à lire, et il est très facile d'introduire des erreurs qui ne sont visibles qu'à l'exécution. En plus de cela, le code fonctionnera lentement en raison de l'overhead introduit en utilisant la réflexion. Au lieu d'utiliser la réflexion, je voudrais que mes objets implémentent des interfaces bien connues dans lesquelles je pourrais les projeter. Cela permettrait à mon code d'être sécurisé et je pourrais éviter les tracas de la réflexion. Le code fonctionnerait aussi beaucoup plus vite et serait plus lisible.

0

Vous ne pouvez pas créer de nouveaux types à la volée en utilisant ni la sérialisation XML ni la réflexion. Ces techniques ne s'appliquent qu'aux types existants. Si vous avez besoin de créer de nouveaux types lors de l'exécution, vous devrez utiliser une autre approche. Cependant, générer des types de mouche est d'une utilité limitée puisque vous ne pouvez utiliser la réflexion que pour accéder à ces types. L'utilisation de l'environnement d'exécution dynamique dans la prochaine version majeure de .NET vous donnera plus d'options pour créer et utiliser des types dynamiques.

La sérialisation XML est destinée à la sérialisation d'objets vers et depuis un format connu (XML). La réflexion est beaucoup plus générale et vous permet d'inspecter des informations de type à l'exécution et de manipuler des objets sans connaître leur type lors de la compilation. Vous pouvez également faire une sérialisation en utilisant la réflexion, mais c'est beaucoup plus encombrant comparé à la sérialisation XML.

+0

Il n'est pas vrai que vous ne pouvez pas créer de nouveaux types à la volée avec Reflection. Jetez un oeil à Reflection Emit. –

+0

@Mark Seemann. L'espace de noms 'System.Reflection.Emit' était ce que je pensais quand j'ai écrit" une autre approche ". Je ne considère pas cette partie de la réflexion «normale», mais plutôt un cadre pour les compilateurs et les générateurs de code pour générer du code plutôt que pour réfléchir sur le code. Votre définition de «réflexion» peut bien entendu être différente. –