我将XML反序列化为列表<>是空的

时间:2015-11-08 09:33:57

标签: c# xml-deserialization

我遇到从XML中deserilizatiopn填充List的问题。

这是我的类对象(在客户端上):

[Serializable, XmlRoot("Groups"), XmlType("Groups")]
public class Groups
{
    public Groups()
    {
        group = new List<Group>();
    }

    [XmlArray("Items")]
    [XmlArrayItem("Group", typeof(Group))]
    public List<Group> group { get; set; }
}

[XmlType("Group")]
public class Group
{
    [XmlElement("GroupRef")]
    public Guid GroupRef;
    [XmlElement("Name")]
    public string Name;
    [XmlElement("Description")]
    public string Description;
}

这是Deserializethings:

的代码
XmlSerializer serializer = new XmlSerializer(typeof(Groups));                   
var groups = (Model.Groups)serializer.Deserialize(reader);

这是XML:

<Groups>
  <Group>
  <GroupRef>00000000-0000-0000-0000-000000000000</GroupRef> 
  <Name>Todays Work</Name> 
  <Description>System</Description> 
</Group>
<Group>
  <GroupRef>00000000-0000-0000-0000-000000000000</GroupRef> 
  <Name>All</Name>  
  <Description>System</Description> 
</Group>
<Group>
  <GroupRef>00000000-0000-0000-0000-000000000000</GroupRef> 
  <Name>Unassigned</Name> 
  <Description>System</Description> 
 </Group>    
</Groups>

我没有错误,但对象数为零?

3 个答案:

答案 0 :(得分:2)

您的输入XML格式错误。如果我构造对象并序列化它,我得到

<Groups>
<Items>
    <Group>
        <GroupRef>bf2616d7-b98c-4743-8e25-2e0e101ab2da</GroupRef>
        <Name>test</Name>
        <Description>desc</Description>
    </Group>
</Items>
</Groups>

所以你应该根据你当前的设计包装每个组。

答案 1 :(得分:2)

问题在于属性组上使用的属性。 使用您定义的属性,所有XML元素&#34; Group&#34;需要包含在名为&#34; Items&#34;。

的元素中

解决方案很简单,只需使用XmlElement属性,如下所示。一旦您更改了属性以使用XmlElement(&#34; Group&#34;),它就可以正常工作。

public class Groups
{
    public Groups()
    {
        group = new List<Group>();
    }

    [XmlElement("Group")]
    public List<Group> group { get; set; }
}

答案 2 :(得分:0)

您的XML无法正确反映班级Groups的结构。将您的XML更改为此

<Groups>
    <ArrayOfGroup>
        <Group>
          <GroupRef>00000000-0000-0000-0000-000000000000</GroupRef> 
          <Name>Todays Work</Name> 
          <Description>System</Description> 
        </Group>
        <Group>
          <GroupRef>00000000-0000-0000-0000-000000000000</GroupRef> 
          <Name>All</Name>  
          <Description>System</Description> 
        </Group>
        <Group>
          <GroupRef>00000000-0000-0000-0000-000000000000</GroupRef> 
          <Name>Unassigned</Name> 
          <Description>System</Description> 
         </Group>
    </ArrayOfGroup>
</Groups>

类定义为

public class Groups
{
    public Groups()
    {
        Group = new List<Group>();
    }

    [XmlArray("ArrayOfGroup")]
    public List<Group> Group { get; set; }
}

public class Group
{
    public Guid GroupRef;
    public string Name;
    public string Description;
}

此代码将正确反序列化您的XML

XmlSerializer serializer = new XmlSerializer(typeof(Groups));
StringReader reader = new StringReader(xmlString);
var groups = (Groups)serializer.Deserialize(reader);

或者,您可以将标记用XML命名为&#34; Items&#34;并将XmlArray属性重命名为&#34; Items&#34;就像你原来做的那样。