C# 如何序列化基类型集合并在易于阅读的XML中查看具体类型

C# 如何序列化基类型集合并在易于阅读的XML中查看具体类型,c#,xml,wcf,serialization,datacontractserializer,C#,Xml,Wcf,Serialization,Datacontractserializer,我有一个列表,其中填充了各种具体类型的对象,这些对象是BaseType的子类 我正在使用WCF DataContractSerializer <Children> <BaseType xmlns:d3p1="http://schemas.datacontract.org/2004/07/Tasks" i:type="d3p1:ConcreteTypeA"></BaseType> <BaseType xmlns:

我有一个列表,其中填充了各种具体类型的对象,这些对象是BaseType的子类

我正在使用WCF DataContractSerializer

<Children>
    <BaseType xmlns:d3p1="http://schemas.datacontract.org/2004/07/Tasks"
              i:type="d3p1:ConcreteTypeA"></BaseType>
    <BaseType xmlns:d3p1="http://schemas.datacontract.org/2004/07/Tasks"
              i:type="d3p1:ConcreteTypeB"></BaseType>
</Children>

有没有办法让它产生

<Children>
    <ConcreteTypeA/>
    <ConcreteTypeB/>
</Children>

?


真正的目标是让用户生成一些XML以加载到内存中,而用户的技能水平要求他们提供原始XML是不会成功的。

DataContractSerializer的设计目的不是让您控制输出。它被设计为快速、隐式,并且易于为类赋予属性

您需要的是XmlSerializer。这使您能够更好地控制XML输出

请注意,在我下面的示例中,我指定了许多可以从属性名推断的内容,只是为了让您感觉可以在属性中重写它们。事实上,我认为如果删除了所有属性并应用了一些KnownTypeAttributes,整个类就可以序列化了,但我还没有测试它。我不知道这是否能提供您所描述的确切XML(它将在子元素上方创建一个根元素),但希望这能为您指明正确的方向

编辑:我刚刚测试过,它产生了一些非常接近你所寻求的东西

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)



你应该给出你想要的代码示例。他做了,但没有正确标记。我为他修复了它。我可以在运行时添加已知类型而不是通过属性吗?类型可以由用户通过插件模型添加。是的,XMLSerialAdter的构造函数有一个超载,允许您在类型数组中传递其他类型来考虑。
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();
    }

}
<MyClass>
  <Children>
    <ConcreteTypeA />
    <ConcreteTypeB />
    <ConcreteTypeA />
    <ConcreteTypeB />
  </Children>
</MyClass>