2016-11-16 69 views
1

我想知道是否可以有條件地排除列表中的項目使用ShouldSerialize*模式進行序列化。例如採取兩類:列表項的條件XML序列化

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;} 
} 

我可以去只有.Selected = true序列化的ProductStyles屬性中的項目?這是否可以使用ShouldSerialize*模式

+1

使列表成爲私人的,然後創建一個公共屬性過濾返回結果之前的列表。 – jdweng

回答

1

XmlSerializer沒有內置功能來在序列化期間省略選定的收集條目。實現最快的方法是使用代理數組屬性,像這樣:

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); 
     } 
    } 
} 

(有關爲何替代陣列應優先用於替代List<Styles>的解釋,見here。)