2009-09-04 5 views
2

J'utilise les classes de sérialisation .NET pour sérialiser XML et enregistrer les valeurs d'argument qui sont transmises à certaines fonctions de mon application. Pour cela, j'ai besoin d'un moyen pour sérialiser XML les valeurs de propriété de toutes les classes qui obtiennent des passes, mais en ignorant toutes les propriétés qui ne peuvent pas être sérialisées XML (par exemple toutes les propriétés de type Image).Obtention de la sérialisation XML pour ignorer automatiquement les propriétés non sérialisables

Je pourrais parcourir mes classes et marquer de telles propriétés avec l'attribut [XmlIgnore], mais idéalement je voudrais un sérialiseur qui saute ces propriétés.

Est-ce réalisable?

Répondre

2

Vous pouvez utiliser la réflexion pour créer dynamiquement un objet XmlAttributeOverrides afin d'ajouter l'attribut XmlIgnore aux propriétés pertinentes. Vous devez juste implémenter la logique pour déterminer si un type donné est éligible pour la sérialisation XML et parcourir le graphe d'objet de manière récursive. Lorsque vous avez fini de créer l'objet XmlAttributeOverrides, transmettez-le simplement au constructeur XmlSerializer

0

Cela est probablement à peu près aussi efficace que votre idée "XMLIgnore", mais vous pouvez utiliser XPath pour transmettre uniquement des parties sérialisables à la fonction sérialiser.

0

Si vous contrôlez une classe de base commune, vous pouvez l'implémenter via la réflexion, sans quoi cela risque d'être fastidieux. Vous pouvez implémenter un schéma de sérialisation Xml personnalisé - ce n'est pas si difficile, mais je doute que ça en vaille la peine. De plus, si vous "ignorez" automatiquement les propriétés non sérialisables pour toutes les classes, vous devrez penser au niveau auquel vous le faites - sinon, les classes non sérialisables deviennent elles-mêmes sérialisables, mais ont juste leurs propres propriétés. qui ne sont pas (entièrement) sérialisables.

0

Vous devez sous-classer XmlSerializer et remplacer la méthode virtualisée Serialize (objet, XmlSerializationWriter). Vous devrez probablement implémenter votre propre XmlSerializationWriter.

Bonne chance!

Editer: Vérifiez le commentaire de Thomas ci-dessous. Je suppose qu'il a raison.

+1

Je vous conseille de ne pas utiliser cette route: XmlSerializer n'effectue pas directement la sérialisation, il génère un autre assemblage pour le faire. Vous devrez donc changer la façon dont l'assemblage de sérialisation est généré, ce qui pourrait être assez difficile ... –

Questions connexes