C# 将某些XML(通过流)反序列化为父/子对象

C# 将某些XML(通过流)反序列化为父/子对象,c#,generics,serialization,xml-serialization,C#,Generics,Serialization,Xml Serialization,我有一个相当简单的DAL总成,由一个SalesInquiry类组成,其中包含另一个车辆的列表 我们将通过电子邮件接收XML文件,我希望使用这些文件填充SalesInquiry类的实例,因此我尝试使用反序列化 我已经为这两个类添加了我认为合适的XMLRoot/xmlement/XMLIgnore属性。但是,当我尝试反序列化时,会填充父SalesInquiry对象,但不会填充子Vehicle对象 我知道反序列化列表可能很棘手,但我不知道为什么,如何避免问题,甚至不知道这是否是我挣扎的原因 在调试过程

我有一个相当简单的DAL总成,由一个
SalesInquiry
类组成,其中包含另一个
车辆的
列表

我们将通过电子邮件接收XML文件,我希望使用这些文件填充SalesInquiry类的实例,因此我尝试使用反序列化

我已经为这两个类添加了我认为合适的
XMLRoot
/
xmlement
/
XMLIgnore
属性。但是,当我尝试反序列化时,会填充父SalesInquiry对象,但不会填充子Vehicle对象

我知道反序列化
列表
可能很棘手,但我不知道为什么,如何避免问题,甚至不知道这是否是我挣扎的原因

在调试过程中,我已经成功地序列化了一个Vehicle对象,因此我假设我的方向是正确的,但是当我反序列化SalesInquiry XML(其中包含一个或多个子车辆)时,
列表
不会被填充

我哪里做错了

更新

在一个测试项目中,我序列化了一个包含两辆车的
SalesInquiry
,并保存到一个文件中。然后,我将该文件加载到一个反序列化的对象中,并将其重新加载到另一个
saleenquiry
对象中。成功了

那么有什么区别呢?车辆记录如下:

<?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>
...

100001
汽车
河流浅水处
C-Max
...
需要注意的是,Vehicle有一个初始资本,而我传入的XML没有。在我的
Vehicle
类中,我给了这个类一个
[XmlRoot(“Vehicle”)]
属性,我认为它可以创建链接,但显然不是。我想这是有道理的,因为尽管Vehicle本身就是一个类,但它只是SalesInquiry中列表中的一个数组项

在这种情况下,问题是-如何注释
Vehicle
类,以便将传入的XML元素(
)映射到我的列表项(
Vehicle
)?
[XmlArrayItem]
(或
[XmlElement]
)对此声明类型无效

在本例中,我可以要求生成XML的人员使用
而不是
,但在某些情况下,我可能没有这种自由,因此我宁愿学习解决方案,也不愿应用变通方法


结论


通过将[XmlArrayItem(“vehicle”,typeof(vehicle))]添加到我的列表的现有装饰中,XML现在能够完全反序列化。呸

这是一对带有适当装饰的工作类:

(注意:XmlAnyElement和XmlAnyAttribute是可选的。我习惯于提高实体的灵活性。)

[XmlType(“查询”)]
[XmlRoot(“查询”)]
公开课查询
{
私人列表车辆=新列表();
[XmlElement(“查询编号”)]
公共int查询编号{get;set;}
[XmlArray(“车辆”)]
[XmlArrayItem(“车辆”,类型(车辆))]
公共清单车辆
{
获取{返回this.vehicles;}
设置{this.vehicles=值??新列表();}
}
[xmlanyement]
公共XmlElement[]任意元素;
[XmlAnyAttribute]
公共xmldattribute[]AnyAttributes;
}
公车
{
[XmlElement(“车辆类型”)]
公共字符串VehicleType{get;set;}
[XmlElement(“车辆制造”)]
公共字符串VehicleMake{get;set;}
[XmlElement(“车辆模型”)]
公共字符串VehicleModel{get;set;}
}

下面是一对带有适当装饰的工作类:

(注意:XmlAnyElement和XmlAnyAttribute是可选的。我习惯于提高实体的灵活性。)

[XmlType(“查询”)]
[XmlRoot(“查询”)]
公开课查询
{
私人列表车辆=新列表();
[XmlElement(“查询编号”)]
公共int查询编号{get;set;}
[XmlArray(“车辆”)]
[XmlArrayItem(“车辆”,类型(车辆))]
公共清单车辆
{
获取{返回this.vehicles;}
设置{this.vehicles=值??新列表();}
}
[xmlanyement]
公共XmlElement[]任意元素;
[XmlAnyAttribute]
公共xmldattribute[]AnyAttributes;
}
公车
{
[XmlElement(“车辆类型”)]
公共字符串VehicleType{get;set;}
[XmlElement(“车辆制造”)]
公共字符串VehicleMake{get;set;}
[XmlElement(“车辆模型”)]
公共字符串VehicleModel{get;set;}
}

仅就答案而言,你就应该获得25%的声誉,但我希望我能为你提供更多,因为这个例子的彻底性。谢谢。单是你的答案就应该得到25%的声誉,但我希望我能给你更多,因为这个例子的彻底性。谢谢
[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; }
}