4

考虑以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<treelist id="foo" displayname="display">
  <treelink id="link" />
</treelist>

我已经设置了以下代码:

    private static void Main(string[] args)
    {
        StreamReader result = File.OpenText(@"test.xml");

        var xmlTextReader = new XmlTextReader(result.BaseStream, XmlNodeType.Document, null);

        XDocument load = XDocument.Load(xmlTextReader);
        
        var xmlSerializer = new XmlSerializer(typeof (TreeList));

        var foo = (TreeList) xmlSerializer.Deserialize(load.CreateReader());
    }

这些是我的实体:

[Serializable]
[XmlRoot("treelink")]
public class TreeLink
{
    [XmlAttribute("id")]
    public string Id { get; set; }
}

[Serializable]
[XmlRoot("treelist")]
public class TreeList
{
    [XmlAttribute("id")]
    public string Id { get; set; }

    [XmlAttribute("displayname")]
    public string DisplayName { get; set; }

    [XmlArray("treelist")]
    [XmlArrayItem("treelist", typeof (TreeLink))]
    public TreeLink[] TreeLinks { get; set; }
}

但是我无法反序列化树链接对象,在fooTreeLinks 中始终保持为空。

我在这里做错了什么?

4

1 回答 1

7

XmlElement在树链接的“列表”上使用。

[XmlElement("treelink")]
public TreeLink[] TreeLinks { get; set; }

使用[XmlArray][XmlArrayItem]暗示您希望在父类中它们自己的包装容器中的树链接 - 换句话说,它需要这样的 xml:

<treelist id="foo" displayname="display">
  <treelist>
    <treelist id="link" />
  </treelist>
</treelist>

这里的诀窍总是从另一个方向开始。标记您的类以进行序列化,然后序列化您的类型的实例并查看它生成的 xml。然后,您可以对其进行调整,直到它看起来像您最终想要反序列化的 xml。这比试图猜测为什么您的 xml 没有正确反序列化要容易得多。

于 2012-02-20T13:47:18.187 回答