【问题标题】:Deserialize XML to List<T> with XmlRootAttribute使用 XmlRootAttribute 将 XML 反序列化为 List<T>
【发布时间】:2012-04-06 10:45:12
【问题描述】:

我有一个名为 Car 的类,有一个名为 LicencePlate 的属性, 当我用 XmlRootAttribute Cars 序列化一个列表时,创建的 XML 是

<Cars>
<Car>
 <LicencePlate></LicencePlate>
</Car>
<Cars>

序列化的代码是

XmlSerializer ser = new XmlSerializer(ListCars.GetType(), new XmlRootAttribute("Cars"));

但是当我反序列化这个 XML 时会发生错误,因为该类没有“Cars”属性。

有人可以帮助我吗?

【问题讨论】:

  • 反序列化是否使用相同的代码?

标签: c# xml-serialization xmlserializer xml-deserialization


【解决方案1】:

试试这个:

汽车类:

public class Car
{
    public string LicencePlate { get; set; }
}

您的 XML 类:

[XmlRoot("Cars")]
public class ListCars
{
    [XmlElement("Car")]
    public List<Car> Car { get; set; }
}

干杯。

【讨论】:

    【解决方案2】:

    您需要使用与序列化对象相同的 XmlSerializer 来反序列化对象。通常你会在类本身中指定 XML 结构,使用 XmlElementAttribute 和相关的 XML 序列化属性。

    如果由于某种原因,在序列化对象时确实需要覆盖根元素,则需要在另一个方向上覆盖根元素。

    var output = new MemoryStream();
    LoadSerializedObjectIntoTheStream(output);
    
    var ser = new XmlSerializer(typeof(ListCars), new XmlRootAttribute("Cars"));
    var carlist = ser.Deserialize(output) as ListCars;
    

    【讨论】:

    • 但是xml不是我生成的,谁来生成不知道标签名,所以我想知道一个简单的方法来改变这个标签名
    • 你能把 XML 作为 XML 文档打开并读取根标签的名称吗?
    【解决方案3】:

    如有疑问,请正确执行:

    [XmlRoot("Cars"), XmlType("Cars")]
    public class SomeWrapper {
        [XmlElement("Car")]
        public List<Car> Cars { get { return cars; } }
        private readonly List<Car> cars = new List<Car>();
    }
    

    这个包装器应该知道正确序列化/反序列化。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多