2010-04-10 25 views
4

我有填充了我使用WCF的DataContractSerializer如何序列化的基础类型的集合,看看具体的类型易于读取XML

其子类BASETYPE

各种具体类型的对象列表

<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不会成功。

+0

你应该给你想要的代码示例.. – Nix 2010-04-10 01:09:50

+0

他做到了,它没有标明正确。我为他修好了。 – Josh 2010-04-10 02:57:19

回答

7

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> 
+0

我可以在运行时添加已知类型而不是通过attribute?类型可以由用户通过插件模型添加。 – 2010-04-10 23:34:08

+0

是的,有一个XmlSerializer的构造函数的重载,允许您传入类型数组中需要考虑的其他类型。 http://msdn.microsoft.com/en-us/library/e5aakyae(v=VS.90).aspx – Josh 2010-04-11 01:56:23

相关问题