Linq to Xml VS XmlSerializer VS DataContractSerializer

Dans mon web method, j'obtiens un objet de la troisième partie C# classe d'entité. La classe entity n'est rien d'autre que le DataContract. Cette classe d'entités est assez complexe et a des propriétés de différents types, certaines propriétés sont des collections aussi. Bien sûr, ces types liés sont aussi des contrats de données.

je veux sérialiser cette entité DataContract en XML dans le cadre de la logique commerciale de mon service web. je ne peux pas utiliser DataContractSerializer directement (sur l'objet que je reçois dans le méthode web) simplement parce que le schéma XML est tout à fait différent. ainsi le XML généré par DataContractSerializer ne sera pas validé par rapport au schéma.

Je ne suis pas en mesure de conclure l'approche que je devrais suivre pour la mise en oeuvre. Je pouvais penser à la suite de la mise en œuvre d'approches:

  1. LINQ to XML - cela semble correct mais je dois créer l'arborescence XML (c'est-à-dire les éléments ou la représentation XML de l'instance de classe) manuellement pour chaque type d'objet. Comme il existe de nombreuses classes d'entités et qu'elles sont liées entre elles, je pense que c'est trop de travail pour écrire des éléments XML manuellement. De plus, je vais devoir continuer à modifier L'arborescence XML au fur et à mesure que la classe entity introduit une nouvelle propriété. non seulement cela, le code où je génère l'arborescence XML paraîtrait peu maladroit (du moins en apparence) et serait plus difficile à maintenir/changer par un autre développeur à l'avenir; il / elle devra l'examiner de si près pour comprendre comment ce XML est généré.

  2. XmlSerializer - je peux écrire mes propres classes d'entity qui représentent la structure XML que je veux. Maintenant, je dois copier les détails de l'objet entrant dans l'objet de mes propres classes. C'est donc un travail supplémentaire (pour .NET aussi quand le code s'exécute!). Alors je peux utiliser XmlSerializer sur mon objet pour générer XML. Dans ce cas, je vais devoir créer des classes d'entity et chaque fois que l'entity de tiers obtient modifié, je vais juste ajouter une nouvelle propriété dans ma classe. (avec les attributs XmlElement ou XmlAttibute). mais les gens recommandent DataContractSerializer sur celui-ci et donc je ne veux pas finaliser ceci à moins que tous les aspects soient clairs pour moi.

  3. DataContractSerializer - encore une fois ici, je vais devoir écrire ma propre classe d'entity puisque je n'ai aucun contrôle sur les contrats de données de tiers. Et j'ai besoin de copier les détails de l'objet entrant à l'objet de mon propre classe. C'est donc un travail supplémentaire. Cependant, comme DataContractSerializer ne supporte pas les attributs Xml, je vais devoir implémenter IXmlSerializable et générer du Xml WriteXml méthode. DataContractSerializer est plus rapide que XmlSerializer, mais encore une fois je vais devoir gérer les changements (dans WriteXml) si l'entité tierce partie change.

Questions:

  • la meilleure approche dans ce scénario considérant la performance aussi?
  • Pouvez-vous suggérer une meilleure approche?
  • DataContractSerializer vaut la peine d'examiner (parce qu'il a une meilleure performance sur XmlSerilaizer) quand la classe incoming entity est sujette à changement?
  • devrait-on vraiment utiliser LINQ pour la sérialisation? Ou est-ce vraiment bon pour autre chose que les questions?
  • Peut XmlSerializer être préférée à LINQ dans de tels cas? Si oui, pourquoi?
20
demandé sur abatishchev 2012-06-22 10:35:37

3 réponses

je suis d'accord avec la réponse de @Werner Strydom.

j'ai décidé d'utiliser le XmlSerializer parce que le code devient maintenable et il offre des performances que j'attends. Le plus important est qu'il me donne le contrôle complet sur la structure XML.

C'est comment j'ai résolu mon problème:

j'ai créé des classes d'entités (représentant divers types D'éléments Xml) selon mes exigences et j'ai passé une instance de la classe racine (class representing root element) via XmlSerializer.

Petits LINQ en cas de relation 1: M:

là Où je voulais même élément (disons Employee) plusieurs fois sous le noeud spécifique (dire Department) , j'ai déclaré la propriété de type List<T>. par exemple,public List<Employee> Employees dans le Department classe. Dans de tels cas, XmlSerializer a évidemment ajouté un élément appelé Employees (qui regroupe tous les Employee elements) sous le Department nœud. Dans de tels cas, j'ai utilisé LINQ ( après que XmlSerializer a sérialisé l'objet .NET) pour manipuler l' XElement (i.e. XML) généré par XmlSerializer. En utilisant LINQ, j'ai simplement mis tous Employee noeuds directement sous Department noeud et enlevé le Employees nœud.

Cependant, j'ai eu le rendement attendu par la combinaison de xmlSerializer et LINQ.

L'inconvénient est que toutes les classes que j'ai créées devaient être publiques alors qu'elles pourraient très bien l'être de l'intérieur!

Pourquoi pas DataContractSerializer et