DataContractSerializer 并非旨在让您控制输出。它的设计目的是快速、隐式且易于为类赋予属性。
你想要的是 XmlSerializer。这使您可以更好地控制 XML 输出。
请注意,在下面的示例中,我指定了很多可以从属性名称中推断出来的东西,但只是为了让您感觉可以在属性中覆盖它们。事实上,如果所有属性都被删除并且应用了一些 KnownTypeAttributes 但我还没有测试过,我认为整个类都可以序列化。我不知道这是否会为您提供您所描述的确切 XML(它将在 Children 上方创建一个根元素),但希望这会让您朝着正确的方向前进。
控制 XML 序列化的属性
[XmlRoot(Namespace="")]
public class MyClass {
[XmlArray("Children")]
[XmlArrayItem("ConcreteTypeA", typeof(ConcreteTypeA))]
[XmlArrayItem("ConcreteTypeB", typeof(ConcreteTypeB))]
public BaseType[] Children {
get;
set;
}
}
public class BaseType {
}
public class ConcreteTypeA : BaseType {
}
public class ConcreteTypeB : BaseType {
}
编辑:我刚刚测试过,它产生的东西非常接近你所寻求的。
void Main()
{
var mc = new MyClass();
mc.Children = new BaseType[] {
new ConcreteTypeA(),
new ConcreteTypeB(),
new ConcreteTypeA(),
new ConcreteTypeB()
};
var serializer = new XmlSerializer(typeof(MyClass));
using ( var str = new StringWriter() ) {
serializer.Serialize(str, mc);
str.ToString().Dump();
}
}
...产生...(从顶部删除无用的 xmlns)
<MyClass>
<Children>
<ConcreteTypeA />
<ConcreteTypeB />
<ConcreteTypeA />
<ConcreteTypeB />
</Children>
</MyClass>