2013-09-27 94 views
1

我試圖序列化一個虛擬的訂單集合,其中每個訂單都包含一個產品。該集合正在序列化,但訂單內的示例產品屬性正在被遺漏。c#序列化嵌套類

指令集

[XmlRoot("Orders")] 
public class OrderCollection : ICollection<Order> 
{ 
    private static List<Order> _orders; 

    private List<Order> Orders 
    { 
     get 
     { 
      if(_orders == null) 
      { 
       _orders = new List<Order>(); 
      } 

      return _orders; 
     } 
    } 

    //All the ICollection functions 
} 

訂購

public class Order 
{ 
    [XmlElement("Id")] 
    public int Id 
    { 
     get; 
     set; 
    } 

    [XmlElement("Title")] 
    public string Title 
    { 
     get; 
     set; 
    } 

    [XmlElement("IsReserved")] 
    public bool IsReserved 
    { 
     get; 
     set; 
    } 

    [XmlElement("Count")] 
    public int Count 
    { 
     get 
     { 
      return this.Products.Count; 
     } 
     set 
     { 

     } 
    } 

    // not serializing 
    [XmlElement("Product")] 
    public Product ProductTest 
    { 
     get 
     { 
      return new Product(); 
     } 
    } 

    // not serializing 
    [XmlArray("Products")] 
    public ICollection<Product> Products 
    { 
     get 
     { 
      return this._products; 
     } 

    } 

    private List<Product> _products; 

    public Order() 
    { 
     var rand = new Random(); 
     var count = rand.Next(1, 5); 
     this._products = new List<Product>(); 

     for (int i = 0; i < count; i++) 
     { 
      this._products.Add(new Product()); 
     } 
    } 
} 

產品

[Serializable] 
public class Product 
{ 
    [XmlElement("Id")] 
    public int Id 
    { 
     get; 
     set; 
    } 

    [XmlElement("Title")] 
    public string Title 
    { 
     get; 
     set; 
    } 

    public Product() 
    { 
     var rand = new Random(); 
     this.Id = rand.Next(100, 9999); 
     this.Title = "Product " + this.Id; 
    } 
} 

輸出

<?xml version="1.0"?> 
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Order> 
    <Id>619883</Id> 
    <Title>Order 619883</Title> 
    <IsReserved>false</IsReserved> 
    <Count>3</Count> 
    </Order> 
    <Order> 
    <Id>961448</Id> 
    <Title>Order 961448</Title> 
    <IsReserved>false</IsReserved> 
    <Count>3</Count> 
    </Order> 
    <Order> 
    <Id>483677</Id> 
    <Title>Order 483677</Title> 
    <IsReserved>false</IsReserved> 
    <Count>2</Count> 
    </Order> 
    <Order> 
    <Id>512026</Id> 
    <Title>Order 512026</Title> 
    <IsReserved>false</IsReserved> 
    <Count>2</Count> 
    </Order> 
    <Order> 
    <Id>916029</Id> 
    <Title>Order 916029</Title> 
    <IsReserved>false</IsReserved> 
    <Count>4</Count> 
    </Order> 
    <Order> 
    <Id>109800</Id> 
    <Title>Order 109800</Title> 
    <IsReserved>false</IsReserved> 
    <Count>4</Count> 
    </Order> 
</Orders> 

我完全困惑。深度序列化似乎正在工作,因爲否則順序不會在OrderCollection內序列化,但它只是停止。有什麼建議?

+0

我認爲'[的XmlElement( 「產品」)]公衆的ICollection Products'應該是'[XmlArray( 「產品」)]公衆的ICollection Products' HTTP ://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayattribute.aspx – asawyer

+0

我已經嘗試過了,爲了排除它,我添加了單個ProductTest屬性,它不是序列化的。 – Craig

+1

嘗試拋開你在那裏的所有額外代碼。將您的類創建爲_simple_ plain-old-CLR對象。沒有空置的setter,沒有隻讀屬性,沒有什麼花哨,看看會發生什麼。 (另外,爲什麼後臺字段是'private static List _orders;'static?)對於您的XML序列化,您最好使用一個代表您的XML模式的簡單數據模型。如果您想要添加業務/邏輯/驗證,則可以通過轉換到/不考慮序列化問題的內部業務類來單獨執行。 –

回答

4

您必須將ICollection更改爲列表。接口不可序列化。

[XmlArray("Products")] 
public List<Product> Products 
{ 
    get 
    { 
     return this._products; 
    } 

} 

而且ProductTest不會因爲缺少二傳手

+0

非常好,這工作。謝謝。問題是,我敢肯定,代碼分析會抱怨公開列表而不是ICollection - 那麼最好在那裏做什麼? – Craig

+0

您可以使用集合而不是列表或禁用規則。兩者都是有效的方式(在我看來)。如果你想要一個集合,你可以用它來創建一個新的集合(this._products); – Uwe

0

您不能序列接口的工作..

接口無非就是一組行爲的描述了。它沒有提到一個實例的內容。特別是,儘管實現接口的類的實例必須實現其所有成員,但它肯定會擁有需要序列化的屬性。

PS:從Serializing interfaces

0

變爲列表複製。

公開名單的產品 {

}