2009-12-24 3 views
1

Je voudrais contrôler sérialisation Xml sur chaque élément d'une liste, supposons que vous avez ceci:sérialisation conditionnelle sur chaque élément d'une liste

public class Item { 
     [XmlElement("id")] 
    public int Id { get; set; } 
     [XmlElement("label")] 
    public string Label { get; set; } 

    #region Conditional serialization 
     public bool ShouldSerializeLabel() 
     { 
      return !string.IsNullOrEmpty(Label); 
     } 
    #endregion 
} 

public class Root { 
    [XmlArray("items")] 
    [XmlArrayItem("item")] 
    public List<Item> Items { get; set; } 

    #region Conditional serialization 
    // Suppose I have two items but one has no label, 
    // How to avoid this : 
    // <items> 
    // <item> 
    //  <id>5</id> 
    //  <label>5</label> 
    // </item> 
    // <item> // I don't want items without label in my collection, how to tell the XmlSerializer not to serialize them 
    //  <id>4</id> 
    // </item> 
    // </items> 
    // 
    // But I still want to have to possibility to do that : 
    // <product> 
    // <item> // this item has no label and it's ok 
    // <id>42</id> 
    // </item> 
    // <price>1.99</price> 
    // </product> 
    #endregion 
} 

Comment dire un élément avec String.IsNullOrEmpty (étiquette) ne doit pas être sérialisé dans ma collection? Ma solution consiste à nettoyer la liste des éléments avant la sérialisation, mais existe-t-il un moyen de le faire de manière déclarative?

+0

Vous devriez vous intéresser à l'implémentation de IXmlSerializable sur votre classe et effectuer une sérialisation/désérialisation personnalisée afin d'ignorer l'élément. Il n'y a pas d'attribut conditionnel dans le langage pour XmlSerializer qui va le faire. Une autre option consiste à faire une boucle sur votre collection d'éléments et à omettre les éléments avec une étiquette vide. –

+0

Votre deuxième option est ma solution de contournement actuelle :) – hoang

Répondre

0

Écrivez votre propre sérialiseur xml. Vous pouvez utiliser l'interface IXmlSerializable ou vous pouvez simplement écrire votre propre méthode ToXml qui génère une chaîne. Il y a plusieurs façons de le faire mais écrire le vôtre vous donnera ce que vous voulez.

+0

Vous avez raison à un moment donné. J'ai ajouté ceci: (! String.IsNullOrEmpty (Label)) WriteXml public void (écrivain XmlWriter) {{ si de writer.WriteElementString ("id", Id); writer.WriteElementString ("label", Label); } } Bien que cela fonctionne pour ma collection, cela signifie également qu'un seul élément sans étiquette ne se sérialisera plus. Ainsi, l'utilisation de IXmlSerializable a un impact global, ce que je ne veux pas. – hoang

+0

De plus, la collection rend un noeud vide: '( – hoang

Questions connexes