DataContractSerializer不是为了让您控制输出而设计的。它被设计为快速,隐含,并且容易为一个类赋予属性。
你想要的是XmlSerializer。这使您可以更好地控制XML输出。
请注意,在我的下面的示例中,我指定了很多可以从属性名称中推断出来的东西,但只是为了让您能够在属性中覆盖它们。事实上,我认为如果所有的属性都被删除了,并且一些KnownTypeAttributes被应用了,但我还没有测试过,那么这个整个类将会很好地序列化。我不知道这是否会给你所描述的确切的XML(它会在儿童之上创建一个根元素),但希望这可以让你朝着正确的方向发展。
Attributes That Control XML Serialization
[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>
你应该给你想要的代码示例.. – Nix 2010-04-10 01:09:50
他做到了,它没有标明正确。我为他修好了。 – Josh 2010-04-10 02:57:19