【问题标题】:Deserializing into a List without a container that contains one more list反序列化为没有包含另一个列表的容器的列表
【发布时间】:2014-10-25 06:52:14
【问题描述】:

我需要使用 XmlSerializer 反序列化此类结构。

  <root>   
    <parameter1>
    5
    </parameter1>
    <itemList>
      <parameter2>5</parameter2>
      <item>v</item>
      <item>v2</item>
    </itemList>
    <itemList>
      <parameter2>50</parameter2>
      <item>v3</item>
      <item>v4</item>
    </itemList>
  </root>

使用此代码:

[XmlRoot("root")]
public class Root
{
    [XmlElement("parameter1")]
    public List<ItemList> Parameter1{ get; set; }

    [XmlElement("itemList")]
    public List<ItemList> ItemLists{ get; set; }
}

public class ItemList
{
    [XmlElement("parameter2")]
    public List<ItemList> Parameter2{ get; set; }

    [XmlElement("item")]
    public List<Item> Items{ get; set; }
}

但它在每个级别上仅反序列化 1 个元素。 如果我使用这样的对象:

[XmlRoot("root")]
public class Root
{
    [XmlElement("parameter1")]
    public List<ItemList> Parameter1{ get; set; }

    [XmlElement("itemList")]
    public List<ItemList> ItemLists{ get; set; }
}

public class ItemList
{
    [XmlElement("parameter2")]
    public List<ItemList> Parameter2{ get; set; }

    public List<Item> Items{ get; set; }
}

它反序列化所有 ItemList 对象,但 Item 列表为空。 有什么问题?

【问题讨论】:

    标签: c# .net xml-serialization


    【解决方案1】:

    查看此文档http://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx

    我认为序列化器无法理解这种结构:

    <root>   
      <parameter1>
      5
      </parameter1>
      <itemList>
        <parameter2>5</parameter2>
        <item>v</item>
        <item>v2</item>
      </itemList>
      <itemList>
      <parameter2>50</parameter2>
        <item>v3</item>
        <item>v4</item>
      </itemList>
    </root>
    

    你应该尝试的是这样的:

    <root>   
      <parameter1>
      5
      </parameter1>
      <itemLists>
        <itemList>
          <parameter2>5</parameter2>
          <items>
            <item>
              <parameter3>v</parameter3>
            </item>
            <item>
              <parameter3>v2</parameter3>
            </item>
          </items>
        </itemList>
        <itemList>
          <parameter2>50</parameter2>
          <items>
            <item>
              <parameter3>v3</parameter3>
            </item>
            <item>
              <parameter3>v4</parameter3>
            </item>
          </items>
        </itemList>
      </itemLists>
    </root>
    

    这将由以下类表示:

    [XmlRoot("root")]
    public class Root
    {
        [XmlElement("parameter1")]
        public int Parameter1{ get; set; }
    
        [XmlElement("itemLists")]
        public List<ItemList> ItemLists{ get; set; }
    }
    
    public class ItemList
    {
        [XmlElement("parameter2")]
        public List<ItemList> Parameter2{ get; set; }
    
        [XmlElement("items")]
        public List<Item> Items{ get; set; }
    }
    
    public class Item
    {
        [XmlElement("parameter3")]
        public string Parameter3{ get; set; }
    }
    

    【讨论】:

    • 对不起,使用 v..v4 我的意思是结构化对象。所以这也行不通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2016-10-01
    相关资源
    最近更新 更多