Comment puis-je renommer les noms de classe via des attributs Xml?

Supposons que j'ai un XML-classe sérialisable appelé Chanson:

[Serializable]
class Song
{
    public string Artist;
    public string SongTitle;
}

Afin d'économiser de l'espace (et aussi semi-obscur le fichier XML), je décide de renommer les éléments xml:

[XmlRoot("g")]
class Song
{
    [XmlElement("a")]
    public string Artist;
    [XmlElement("s")]
    public string SongTitle;
}

Ceci va produire une sortie XML comme ceci:

<Song>
  <a>Britney Spears</a>
  <s>I Did It Again</s>
</Song>

Je veux renommer/reconfigurer le nom de la classe/objet. Dire, dans l'exemple ci-dessus, je souhaite renommer la classe Chanson à g. Afin que le xml résultant devrait ressembler à ceci:

<g>
  <a>Britney Spears</a>
  <s>I Did It Again</s>
</g>

Est-il possible de renommer les noms de classe via xml-attributs?

Je ne souhaite pas créer/parcourir le DOM manuellement, donc je me demandais si il pourrait être réalisé par un décorateur.

Merci d'avance!

Mise à JOUR: Oups! Cette fois, j'ai vraiment did it again!
J'ai oublié de mentionner - en fait, je suis sérialisation d'une liste d'objets de la Chanson dans le XML.

Voici le code de sérialisation:

    public static bool SaveSongs(List<Song> songs)
    {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
            using (TextWriter textWriter = new StreamWriter("filename"))
            {
                serializer.Serialize(textWriter, songs);
            }
    }

Et voici le XML de sortie:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSong>
<Song>
  <a>Britney Spears</a>
  <s>Oops! I Did It Again</s>
</Song>
<Song>
  <a>Rihanna</a>
  <s>A Girl Like Me</s>
</Song>
</ArrayOfSong>

Apparemment, le XmlRoot() attribut ne pas renommer l'objet dans un contexte de liste.

Suis-je raté quelque chose?

  • Je pense qu'il y a une erreur dans le fichier XML. "I did it again" n'est pas le titre exact de la chanson. Le titre exact est: "Oops!...I Did It Again". (Juste pour prévenir de futures frustrations avec les validateurs)
  • Pour info, [Serializable] n'est pas question pour la Sérialisation XML.
  • Voir ma réponse à jour basé sur vos éclaircissements.
  • Il y a quelques années, il pourrait donc être l'élément à mettre à jour la bonne réponse 🙂 La réponse actuellement marquée comme étant correcte est en fait incorrect de la question posée (et n'a pas pour conséquence la sortie désirée). XmlTypeAttribute et ses TypeName propriété est la façon correcte de le faire (voir ci-dessous).
  • Popovsky: Si vous cochez les modifications, même la toute première version de la question n'aurait pas travaillé avec XmlRoot. L'OP n'a pas été ici depuis 2 ans, donc il va continuer à induire en erreur les codeurs de partout 🙂
InformationsquelleAutor invarbrass | 2010-09-06