Comment pouvez-vous contrôler la sérialisation .NET DataContract pour qu'elle utilise des attributs XML au lieu d'éléments?
Si j'ai une classe marquée comme une DataContract
et quelques propriétés marqué avec DataMember
attributs que je peut sérialiser à XML facilement, mais il permettrait de créer une sortie comme:
<Person>
<Name>John Smith</Name>
<Email>[email protected]</Email>
<Phone>123-123-1234</Phone>
</Person>
Ce que je préfère c'est les attributs, tels que...
<Person Name="John Smith" Email="[email protected]" Phone="123-123-1234" />
La DataMember
attribut me permet de contrôler le Nom et l'Ordre, mais pas de savoir s'il est sérialisé comme un élément ou un attribut. J'ai regardé autour et a trouvé DataContractFormat
et IXmlSerializable
mais j'espère qu'il y a-t-il une solution plus facile.
Quelle est la meilleure façon de le faire?
source d'informationauteur Brennan
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire cela avec le
DataContractSerializer
; si vous voulez les attributs que vous devez utiliser leXmlSerializer
à la place. Avec leDataContractSerializer
classe plus restrictives sous-ensemble de la spécification XML est permis, ce qui améliore les performances et améliore l'interopérabilité des services publiés, mais vous donne un peu moins de contrôle sur le format XML.Si vous utilisez des services WCF, alors jetez un oeil à
XmlSerializerFormatAttribute
qui vous permet d'utiliser laXmlSerializer
pour la sérialisation.Vous pouvez faire cela avec l'
DataContractSerializer - la réponse est
pour reprendre la sérialisation Xml
vous-même par la mise en œuvre de la
IXmlSerializable interface. Pour
écrire l'assistance - vous pouvez laisser le
la mise en œuvre de ReadXml vide, et
retourner la valeur null pour GetSchema, puis
écrire la mise en œuvre de WriteXml
comme suit:
Si vous utilisez le même type pour, disons, la sérialisation JSON ainsi, vous êtes toujours libre d'ajouter les attributs DataContract et DataMember - le DataContractSerializer à utiliser l'interface IXmlSerializable seulement la mise en œuvre lors de l'écriture du Xml.
J'ai blogué à propos de cette ici.
Vous pouvez convertir en arrière et en avant entre les attributs et les éléments lors de la sérialisation/désérialisation. Les travaux suivants pour les seconds.