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:
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é.
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 recommandentDataContractSerializer
sur celui-ci et donc je ne veux pas finaliser ceci à moins que tous les aspects soient clairs pour moi.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 XmlWriteXml
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 surXmlSerilaizer
) 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?
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