2009-12-24 24 views
1

我想在一個列表上的每個項目來控制XML序列化的每一項有條件的序列化,假設你有這樣的:在列表

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 
} 

如何判斷與string.IsNullOrEmpty一個項目(標籤) 不應該在我的收藏中序列化?我的解決方法是在序列化之前清理Item的列表,但有沒有辦法以聲明方式執行此操作?

+0

您應該考慮在您的類上實現IXmlSerializable並執行自定義序列化/反序列化以跳過該項目。 XmlSerializer的語言中沒有條件屬性,它將執行此操作。 另一種選擇是循環播放項目集合並省略具有空標籤的項目。 – 2009-12-24 14:34:22

+0

你的第二個選擇是我目前的解決方法:) – hoang 2009-12-24 14:37:57

回答

0

編寫自己的xml序列化程序。您可以使用接口IXmlSerializable 或者您可以編寫自己的ToXml方法輸出一個字符串。有很多方法可以做到這一點,但寫你自己會給你想要的。

+0

你說得沒錯。我添加了這個: public void WriteXml(XmlWriter writer) if(!string.IsNullOrEmpty(Label)) Writer.WriteElementString(「id」,Id); writer.WriteElementString(「label」,Label); } } 雖然它適用於我的收藏,但它也意味着沒有標籤的單個項目不會再序列化。因此,使用IXmlSerializable具有全局影響,這是我不想要的。 – hoang 2009-12-24 15:14:35

+0

此外,集合呈現空的節點:'( – hoang 2009-12-24 16:19:54