2010-08-04 71 views
1

我有一個相當簡單的DAL程序集,它由SalesEnquiry類組成,它包含另一個Vehicle類的List<T>將某些XML(通過流)反序列化爲父/子對象

我們將通過電子郵件接收XML文件,我想用它來填充我的SalesEnquiry類的實例,所以我試圖使用反序列化。

我已將XMLRoot/XMLElement//XMLIgnore屬性添加到兩個類中,因爲我認爲是合適的。但是,當我嘗試反序列化時,父SalesEnquiry對象已填充,但沒有子Vehicle對象。

據我所知,反序列化List<T>可能會很棘手,但我不知道爲什麼,如何避免問題,或者即使這是我爲什麼掙扎。在調試時,我已經成功序列化了一個Vehicle對象,所以我假設我正朝着正確的方向前進,但是當我對SalesEnquiry XML(包含一個或多個子對象)進行反序列化時車輛),List<Vehicle>未填充。

我哪裏錯了?

更新

在測試項目中,我係列化含SalesEnquiry兩輛車並保存到一個文件中。然後,我將文件加載到一個反序列化的對象中。有效!

那有什麼區別?這些車輛記錄如下:

<?xml version="1.0" encoding="utf-8"?> 
<enquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <enquiry_no>100001</enquiry_no> 
    <vehicles> 
    <Vehicle> 
     <vehicle_type>Car</vehicle_type> 
     <vehicle_make>Ford</vehicle_make> 
     <vehicle_model>C-Max</vehicle_model> 
... 

需要注意的是車輛有一個初始資本,而我的傳入的XML沒有。在我的Vehicle班裏,我給了班級一個[XmlRoot("vehicle")]的屬性,我雖然會做鏈接,但顯然不是。我猜這是有道理的,因爲儘管Vehicle本身就是一個類,但它僅僅是我的SalesEnquiry中列表中的一個數組項。

在這種情況下,問題是 - 如何註釋Vehicle類,這樣我可以映射進來的XML元素(<vehicle>)到我的列表項(Vehicle)?[XmlArrayItem](或[XmlElement]就此而言)在此聲明類型中無效。

在此示例中,我可以請求生成XML的人使用<Vehicle>而不是<vehicle>,但可能會出現我沒有這種自由的情況,所以我寧願學習解決方案,而不應用解決方法。


結論

通過添加[XmlArrayItem( 「車輛」 的typeof(車輛))爲我列出現有的裝修,XML現在能夠完全反序列化。唷!

回答

1

這裏的工作對類與適當的裝飾:

(注:XmlAnyElement將和XmlAnyAttribute將是可選的。這是一種習慣,我在促進實體的靈活性。)

[XmlType("enquiry")] 
[XmlRoot("enquiry")] 
public class Enquiry 
{ 
    private List<Vehicle> vehicles = new List<Vehicle>(); 

    [XmlElement("enquiry_no")] 
    public int EnquiryNumber { get; set; } 

    [XmlArray("vehicles")] 
    [XmlArrayItem("Vehicle", typeof(Vehicle))] 
    public List<Vehicle> Vehicles 
    { 
     get { return this.vehicles; } 
     set { this.vehicles = value ?? new List<Vehicle>(); } 
    } 

    [XmlAnyElement] 
    public XmlElement[] AnyElements; 
    [XmlAnyAttribute] 
    public XmlAttribute[] AnyAttributes; 
} 

public class Vehicle 
{ 
    [XmlElement("vehicle_type")] 
    public string VehicleType { get; set; } 
    [XmlElement("vehicle_make")] 
    public string VehicleMake { get; set; } 
    [XmlElement("vehicle_model")] 
    public string VehicleModel { get; set; } 
} 
+0

你應該得到25個單獨答案的聲望,但我希望我可以給你更多的這個例子的徹底性。謝謝。 – CJM 2010-08-05 15:20:55