Comment écrire un commentaire dans un fichier XML lors de l'utilisation de XmlSerializer?
J'ai un objet Foo qui je sérialiser à un flux XML.
public class Foo {
//The application version, NOT the file version!
public string Version {get;set;}
public string Name {get;set;}
}
Foo foo = new Foo { Version = "1.0", Name = "Bar" };
XmlSerializer xmlSerializer = new XmlSerializer(foo.GetType());
Ce travaille de manière rapide, facile et fait tout ce qui est actuellement nécessaire.
Le problème, je vais avoir, c'est que j'ai besoin de maintenir un distinct fichier de documentation avec quelques petites remarques. Comme dans l'exemple ci-dessus, Name
est évident, mais Version
est la version de l'application et non le fichier de données de la version que l'on peut attendre dans ce cas. Et j'ai beaucoup plus semblables que peu de choses je tiens à préciser avec un commentaire.
Je sais que je peux faire si je l'ai créer manuellement mon fichier XML à l'aide de la WriteComment()
fonction, mais est-il possible d'un attribut ou d'une autre syntaxe que je peux mettre en œuvre afin que je puisse continuer à utiliser le sérialiseur fonctionnalité?
source d'informationauteur Jensen
Vous devez vous connecter pour publier un commentaire.
N'est pas possible en utilisant par défaut de l'infrastructure. Vous avez besoin de mettre en œuvre
IXmlSerializable
à vos fins.Très simple de mise en œuvre:
De sortie:
Une autre façon, peut-être préférable: serialize avec linéariseur par défaut, puis effectuer un post-traitement, c'est à dire de mise à jour XML, par exemple à l'aide de
XDocument
ouXmlDocument
.Ceci est possible en utilisant la valeur par défaut de l'infrastructure par l'utilisation de caractéristiques qui retourne un objet de type
XmlComment
et le marquage de ces propriétés avec[XmlAnyElement("SomeUniquePropertyName")]
.I. e. si vous ajoutez une propriété à
Foo
comme ceci:Le code XML suivant sera généré:
Cependant, la question est de demander plus que cela, c'est une certaine façon de regarder le commentaire dans un système de documentation. La suite est accompli en utilisant des méthodes d'extension pour rechercher de la documentation basée sur la réflexion des commentaires du nom de la propriété:
Pour lequel le code XML suivant est généré:
Notes:
La méthode d'extension
XmlCommentExtensions.GetXmlCommentAttribute(this Type type, string memberName)
suppose que le commentaire de la propriété sera nomméxxxXmlComment
oùxxx
est le "réel" de la propriété. Si oui, il peut automatiquement déterminer le véritable nom de la propriété en marquant les entrantsmemberName
attribut avecCallerMemberNameAttribute
. Cela peut être modifié manuellement en passant par le nom réel.Une fois le type et le nom du membre sont connues, la méthode d'extension regarde le commentaire pertinent par la recherche d'une
[XmlComment]
attribut appliqué à la propriété. Ce pourrait être remplacé par un cache de recherche dans un fichier de documentation.Alors qu'il est encore nécessaire d'ajouter le
xxxXmlComment
propriétés pour chaque propriété qui peut être commenté, cela est susceptible d'être moins lourde que la mise en œuvre deIXmlSerializable
directement qui est assez délicate, peut conduire à des bugs dans la désérialisation, et peut exiger imbriquée de la sérialisation des complexes de propriétés enfants.Pour s'assurer que chaque commentaire précède son élément associé, voir Le contrôle de l'ordre de sérialisation en C#.
Pour
XmlSerializer
de sérialiser un bien, il doit avoir à la fois un getter et setter. Donc j'ai donné le commentaire propriétés setters qui ne font rien.De travail .Net violon.
Probablement à la fin de la partie, mais j'ai eu des problèmes quand j'ai essayé de désérialiser l'aide de Kirill les polishchuk solution. Finalement j'ai décidé de modifier le XML après la sérialisation et la solution ressemble: