使用包含自身的派生类型列表反序列化 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
我正在尝试开发一个系统来反序列化用作设置文件的 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