如何在XML反序列化中为它的子组件设置一个arraylist?

时间:2014-07-31 00:07:09

标签: c# xml deserialization

这是我的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; }
}

现在,当我反序列化时,它将反序列化计划 - &gt; Id但不是Plan - &gt;区域。我需要在C#类代码中更改哪些内容才能接受此数据?

2 个答案:

答案 0 :(得分:0)

除非我读错了(我没有做太多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>,这是一个不同的,虽然相似的东西。

答案 1 :(得分:0)

玩了它,终于让它起作用了:

    [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 =&#34;&#34;)添加到Zone DataContract