我反序列化 XML 到 List<> 是空的

My Deserialize XML to List<> is empty

我在从 XML 的反序列化中填充列表时遇到问题。

这是我的 class 个对象(在客户端):

[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;
}

这是反序列化的代码:

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>

我没有收到任何错误,但对象计数为零?

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

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

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

您的 XML 没有正确反映 class 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>

class定义为

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 中的标签命名为 "Items",并将 XmlArray 属性重命名为 "Items",就像您原来所做的那样。

问题出在 属性 组上使用的属性。 使用您定义的属性,所有 XML 元素 "Group" 需要包含在名为 "Items".

的元素中

解决方法很简单,如下使用XmlElement属性即可。将属性更改为使用 XmlElement("Group") 后,它应该可以工作。

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

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