2016-11-16 2 views
1

Je voudrais savoir si l'on peut exclure conditionnellement les éléments d'une liste en les sérialisant à l'aide du modèle ShouldSerialize*. Par exemple prendre les deux classes:Sérialisation XML conditionnelle des éléments de la liste

public class Product{ 
    public int ID {get; set;} 
    public List<Styles> ProductSyles {get; set;} 
} 

public class Styles{ 
    public int ID {get; set;} 
    public bool Selected {get; set;} 
    public string StyleName {get; set;} 
} 

Puis-je aller sur les articles que sérialisation dans la propriété ProductStyles avec .Selected = true? Est-ce possible en utilisant le ShouldSerialize* motif

+1

Rendez la liste private puis créez une propriété publique qui filtre la liste avant de renvoyer les résultats. – jdweng

Répondre

1

XmlSerializer n'a pas de fonctionnalité intégrée pour omettre les entrées de collection sélectionnées pendant la sérialisation. La meilleure façon de mettre en œuvre ce serait d'utiliser une propriété de tableau de substitution, comme ceci:

public class Product 
{ 
    public int ID { get; set; } 

    [XmlIgnore] 
    public List<Styles> ProductSyles { get; set; } 

    [XmlArray("ProductStyles")] 
    public Styles [] SerializableProductSyles 
    { 
     get 
     { 
      if (ProductSyles == null) 
       return null; 
      return ProductSyles.Where(s => s.Selected).ToArray(); 
     } 
     set 
     { 
      if (value == null) 
       return; 
      ProductSyles = ProductSyles ?? new List<Styles>(); 
      ProductSyles.AddRange(value); 
     } 
    } 
} 

(Pour une explication des raisons pour lesquelles un tableau de remplacement doit être utilisé de préférence à un List<Styles> de substitution, voir here.)