使用XmlInclude的多态元素类型名称?

sim*_*sjo 3 .net c# xml-serialization

我想创建一个结构,如:

<root>
 <items>
  <myns:a s="a"/>
  <b s="a"/>
 </items>
</root>
Run Code Online (Sandbox Code Playgroud)

root中的项是来自公共基类的后代.我无法让它发挥作用.以下代码段创建

<root>
 <items>
  <Base xsi:type="A" s="a"/>
  <Base xsi:type="B" s="a"/>
 </items>
</root>

[Serializable]
[XmlInclude(typeof(A))]
[XmlInclude(typeof(B))]
public class Base
{
}

[Serializable]
public class A : Base
{
    public string a = "a";
}

[Serializable]
public class B : Base
{
    public string b = "b";
}

[Serializable]
public class Root
{
    public List<Base> items = new List<Base>();
}
Run Code Online (Sandbox Code Playgroud)

如果我使用XmlType属性,我可以更改xsi:type name,但不能更改name标签.我还想在其中一个标签上使用自定义命名空间,但是如果我将Namespace添加到XmlType,我会收到一条错误消息,指出找不到类型,并且必须添加XmlInclude ..

我想这实际上很简单,我只是无法找出如何..

Qua*_*ter 10

你在寻找XmlArrayItemAttribute吗?

[Serializable]
public class Root
{
    [XmlArrayItem("a", typeof(A), Namespace = "myns")]
    [XmlArrayItem("b", typeof(B))]
    public List<Base> items = new List<Base>();
}
Run Code Online (Sandbox Code Playgroud)

这将序列化为:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <items>
    <a xmlns="myns">
      <a>a</a>
    </a>
    <b>
      <b>b</b>
    </b>
  </items>
</Root>
Run Code Online (Sandbox Code Playgroud)

如果您希望项目是Root的直接子项而不是具有项目元素,则还可以使用XmlElementAttribute.