如何在XML反序列化中为它的子组件设置数组列表?

本文关键字:组件 设置 数组 列表 XML 反序列化 | 更新日期: 2023-09-27 18:15:48

我的XML:

<Plan>
  <Id>default</Id>
  <Layout>default</Layout>
  <Zones>
    <Zone>
      <Id>123</Id>
    </Zone>
    <Zone>
      <Id>456</Id>
    </Zone>
    <Zone>
      <Id>789</Id>
    </Zone>
</Plan>

下面是我的c#类系统来尝试反序列化这些代码:

[DataContract(Namespace = "")]
public class Plan
{
    [DataMember]
    public string Id { get; set; }
    [DataMember]
    public List<Zone> Zones { get; set; }
}
[DataContract]
public class Zone
{
    [DataMember]
    public string Id { get; set; }
}

现在当我反序列化时,它将反序列化Plan -> Id而不是Plan -> Zones。我需要在我的c#类代码中做些什么来让它接受这些数据?

如何在XML反序列化中为它的子组件设置数组列表?

除非我读错了(我没有做太多WCF,但这实际上是一个XML问题),否则反序列化到Zone数组而不是List应该会有所帮助。

如果愿意,可以将数组转换为List。

[DataContract(Namespace = "")]
public class Plan
{
    [DataMember]
    public string Id { get; set; }
    [DataMember]
    public Zone[] Zones { get; set; }
    [XmlIgnore]
    //assumes .NET 3.5+ for LINQ method, otherwise return new List<Zone>(Zones);
    public List<Zone> ZoneList { get { return Zones.ToList(); } }
}
[DataContract]
public class Zone
{
    [DataMember]
    public string Id { get; set; }
}

作为一个侧面的观点,你的问题标题指的是ArrayList,而不是List<T>,这是一个不同的,尽管相似的东西。

试了试,终于成功了:

    [DataContract(Namespace = "")]
    public class Plan
    {
        [DataMember(Order = 0)]
        public string Id { get; set; }

        [DataMember(Order = 1)]
        public List<Zone> Zones { get; set; }
        public Plan()
        {
            this.Id = string.Empty;
            this.Zones = new List<Zone>();
        }
    }
    [DataContract(Namespace = "")]
    public class Zone
    {
        [DataMember(Order = 0)]
        public string Id { get; set; }

        public Zone()
        {
            this.Id = string.Empty;
        }
    }

最终使其工作的更改是添加(Namespace = ")到Zone DataContract