2010-05-18 4 views
0

Ma structure de classe est la suivante.Sérialisation en C#

[Serializable] 
[XmlRootAttribute("person", Namespace = "", IsNullable = false)] 
public class Person : IDisposable 
{ 
     Private int _id; 
     Private string _name; 

     [XmlElement(“id”)] 
     Public int Id 
     { 
      Get{ return _id;} 
      Set{ _id = value;} 
     } 

     [XmlElement(“name”)] 
     Public string Name 
     { 
      Get{return _name;} 
      Set{_name = value;} 
     } 
} 

Je reçois le code XML suivant quand je sérialiser la classe ci-dessus

<person> 
<id>1</id> 
    <name>Test</name> 
</person> 

Maintenant, je voudrais sérialiser la classe ci-dessus comme suit à dire que je voudrais attribut append « type » pour chaque publique propriété sérialisée en tant qu'élément xml. Je peux ajouter un attribut "type" au noeud "person" en déclarant une autre propriété publique "type" avec "[XmlAttribute (" type ")]" mais je voudrais obtenir la même chose pour chaque propriété publique sérialisée en tant qu'élément xml. Toute idée de réaliser ci-dessous:

<person type=”Person”> 
    <id type=”int”>1</id> 
    <name type=”string”>Test</name> 
</person> 

Répondre

2

choses vient d'abord dans mon esprit est de créer une classe générique, nommé par exemple Typed<T>, qui ressemble à ceci:

Ensuite, votre Public int Id , devient Public Typed<int> Id. Il pourrait y avoir une autre façon de faire cela impliquant des substituts pour l'analyseur xml, mais pour le moment c'est sur ma tête.

+0

+1 alternative folle! ... ajouter des conversions implicites vers/à partir de la typée à T, et vous obtenez une utilisation plus simple :) – eglasius

0

réponse d'Ivan est bon, et très créatif, mais peut impliquer refactorisation du code que vous ne voulez pas toucher. Si c'est le cas, vous pouvez envisager d'implémenter IXmlSerializable. Il consiste à travailler directement avec XmlWriter et XmlReader, mais aussi longtemps que vous connaissez les pièges de travailler avec ces classes (en particulier XmlReader) ce n'est pas si mal que ça et vous donne le contrôle suprême sur le format du XML.

Si vous voulez obtenir la fantaisie, vous pouvez même écrire un XmlSerializationWrapper<T> qui implémente IXmlSerializable et utilise la réflexion pour obtenir les [Xml...] attributs de T et ses membres afin de déterminer comment formater/lire le XML, en ajoutant/en utilisant le type Attribut. Mais à ce stade, il est probablement moins fou d'utiliser la solution d'Ivan.

+0

Sons créatifs; Je peux bien essayer, mais je dois décorer pour tous les types construits. Est-ce la voie à suivre? –

+0

Si vous utilisiez la méthode générique, la nécessité de décorer les types intégrés dépendrait de la façon dont vous implémenteriez la découverte des membres sérialisables. J'aurais tendance à le manipuler de la même manière que la sérialisation du framework: si une propriété est décorée avec un attribut XML, sérialiser comme indiqué par l'attribut; si décoré avec XmlIgnore, ne le sérialisez pas; si non décoré, sérialiser en utilisant le nom de la propriété comme nom de noeud. L'ajout de l'attribut type est juste une question d'écriture de typeof (propriété) .Name. – allonym

Questions connexes