Xml序列化具有自定义标记名称的不同类的数组

Vla*_*lov 2 c# arrays xml-serialization

假设我有以下类结构:

[XmlInclude(typeof(CustomNode))]
[XmlInclude(typeof(CustomNode2))]
[XmlRoot("node")]
class Node
{
    [XmlElement("node")]
    public Node[] Children { get; set; }
}
[XmlRoot("custom-node")]
class CustomNode : Node { }
[XmlRoot("custom-node-2")]
class CustomNode2 : Node { }
Run Code Online (Sandbox Code Playgroud)

我创建了以下结构:

var root = new Node { Children = new Node[2] };
root.Children[0] = new CustomNode();
root.Children[1] = new CustomNode2();
Run Code Online (Sandbox Code Playgroud)

当我Xml序列化这个结构时,我得到以下输出:

<node>
    <node xsi:Type="CustomNode"/>
    <node xsi:Type="CustomNode2"/>
</node>
Run Code Online (Sandbox Code Playgroud)

但我想看到(并能够正确加载)这样的东西:

<node>
    <custom-node/>
    <custom-node-2/>
</node>
Run Code Online (Sandbox Code Playgroud)

是否可以用于XmlSerializer?整个问题是因为我打算手动创建source xml,并且我试图让它变得更加人性化和友好.

Blu*_*ueM 7

我为你的问题找到了一个解决方案,几乎是你需要的:

  [XmlRoot(ElementName = "node")]
  public class Node
  {
    [XmlArrayItem(typeof(CustomNode), ElementName = "custom-node")]
    [XmlArrayItem(typeof(CustomNode2), ElementName = "custom-node-2")] 
    public List<Node> Children { get; set; }     
  }
  [XmlRoot(ElementName = "custom-node")]
  public class CustomNode : Node { }
  [XmlRoot(ElementName = "custom-node-2")]
  public class CustomNode2 : Node { }
Run Code Online (Sandbox Code Playgroud)

结果是:

<node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Children>
    <custom-node />
    <custom-node-2 />
  </Children>
</node>
Run Code Online (Sandbox Code Playgroud)

希望有点帮助.