将某些XML(通过流)反序列化为父/子对象
我有一个相当简单的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现在能够完全反序列化。唷!
这里的工作对类与适当的装饰:
(注: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; }
}
你应该得到25个单独答案的声望,但我希望我可以给你更多的这个例子的彻底性。谢谢。 – CJM 2010-08-05 15:20:55