C# 使用派生类型列表反序列化类,包括从XML到C的类本身#

C# 使用派生类型列表反序列化类,包括从XML到C的类本身#,c#,recursion,derived-class,xml-deserialization,C#,Recursion,Derived Class,Xml Deserialization,我正在尝试开发一个系统来反序列化用作设置文件的XML文档。目前,除了一个用于工具布局和设置的节点外,我已经完成了整个工作。我的节点测试示例在结构上如下所示: <ListNode X="0" Y="0"> <ValueNode X="0" Y="0"> <Val1><X>-1400</X><Y>4995</Y><Z>933</Z></Val1>

我正在尝试开发一个系统来反序列化用作设置文件的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>

-14004995933
-1.385-.055
1.
10-953
4.21-.055
32
4249-6
67
90
ListNodes可以有任意数量的子节点,如图所示,ListNodes可以是子节点,从而使它们具有递归性。在这种情况下,ValueNodes将不具有用于表示整数、浮点和向量的子节点以外的子节点

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

[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;
}
[xmlclude(typeof(ListNode)),
xmlclude(typeof(ValueNode))]
公共类工具设置
{
[XmlAttribute(“X”)]
公共int X;
[xmldattribute(“Y”)]
公共智力;
}
[XmlType(TypeName=“ListNode”)]
公共类ListNode:工具设置
{
[XmlArray]
[XmlArrayItem(typeof(ListNode)),
XmlArrayItem(typeof(ValueNode))]
公共列表节点;
}
[XmlType(TypeName=“ValueNode”)]
公共类值节点:工具设置
{
[XmlElement(“Val1”)]
公共向量3 Val1;
[XmlElement(“Val2”)]
公共向量2 Val2;
[xmlElement(“Val3”)]
公共int Val3;
}

我遇到的问题是,无法填充ListNode类的列表成员“ValueNodes”。由于存在潜在的重叠,我尝试分别或一起删除XmlInclude和XmlArray.*属性,但结果是一样的。我已尝试使用与ValueNodes成员相同的列表替换此节点的顶层,并成功填充了该列表,但子ListNode仍然无法获得填充的列表。

您应该忽略
XmlArray
属性。请参阅
xmlementattribute
at

的文档。根据我的经验,解决此问题的最佳方法是使用您创建的.NET类型设置一些内存中的数据,然后将其序列化。序列化XML的结构与您试图反序列化的XML的结构之间的差异应该会帮助您找到正确的方向。感谢您的快速评论。根据您的建议,序列化的ListNode包含“ValueNodes”列表的子节点,否则将正确显示。有没有办法让序列化程序考虑列表内容是ListNoad的内容,而不写“ValueNoDes”子节点?对不起,如果这是一个重复的帖子,但是我无法找到在我的帖子之前解决问题的线程。现在,我已经看到了答案,我也能够找到相关的帖子,虽然不是在同一个上下文中。再次抱歉。我能够达到预期的结果,但这样做并用XmlElement thx替换XmlArrayItem