2010-08-04 100 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