使用包含自身的派生类型列表反序列化 class 从 XML 到 C#

deserialize class with list of derived types including itself From XML to C#

我正在尝试开发一个系统来反序列化用作设置文件的 XML 文档。目前,除了用于工具布局和设置的一个节点外,我已经完成了所有工作。我的节点测试示例在结构上如下所示:

<ListNode  X="0" Y="0">
    <ValueNode X="0" Y="0">
        <Val1><X>-1400</X><Y>4995</Y><Z>933</Z></Val1>
        <Val2><X>-1.385</X><Y>-.055</Y></Val2>
        <Val3>1</Val3>
    </ValueNode>
    <ListNode X="1" Y="0">
        <ValueNode X="0" Y="0">
            <Val1><X>10</X><Y>-95</Y><Z>3</Z></Val1>
            <Val2><X>4.21</X><Y>-.055</Y></Val2>
            <Val3>32</Val3>
        </ValueNode>
        <ValueNode X="0" Y="1">
            <Val1><X>42</X><Y>49</Y><Z>-6</Z></Val1>
            <Val2><X>6</X><Y>7</Y></Val2>
            <Val3>90</Val3>
        </ValueNode>
    </ListNode>
</ListNode>

ListNodes 可以有任意数量的子节点,如图所示,ListNodes 可以是子节点,因此 recursive.In 在这种情况下,ValueNodes 将没有子节点,除了用于表示 ints、floats 和向量。

在我的 C# 应用程序中,我有 classes 这些节点应该被反序列化为定义如下:

[XmlInclude(typeof(ListNode)),
XmlInclude(typeof(ValueNode))]
public class ToolSettings
{
    [XmlAttribute("X")]
    public int X;
    [XmlAttribute("Y")]
    public int Y;
}
[XmlType(TypeName = "ListNode")]
public class ListNode : ToolSettings
{
    [XmlArray]
    [XmlArrayItem(typeof(ListNode)),
    XmlArrayItem(typeof(ValueNode))]
    public List<ToolSettings> ValueNodes;
}

[XmlType(TypeName = "ValueNode")]
public class ValueNode : ToolSettings
{
    [XmlElement("Val1")]
    public Vector3 Val1;
    [XmlElement("Val2")]
    public Vector2 Val2;
    [xmlElement("Val3")]
    public int Val3;
}

我遇到的问题是无法填充 ListNode class、"ValueNodes" 的列表成员。由于可能存在重叠,我已尝试单独和一起删除 XmlInclude 和 XmlArray.* 属性,但结果是相同的。我已尝试用与 ValueNodes 成员相同的列表替换此节点的顶层并成功填充该列表,但子 ListNode 仍然无法获得填充列表。

您应该省略 XmlArray 属性。请参阅 XmlElementAttribute 的文档 https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute(v=vs.110).aspx