XmlSerializer,带有动态内容的XmlArray ......怎么样?

时间:2011-04-05 11:21:00

标签: c#-4.0 .net-4.0 xmlserializer

开始:这也适用于REST deserialiaztion,因此自定义的XmlSerializer是不可能的。

我有一个类的层次结构,需要从“信封”中进行序列化和反序列化。它有一个名为“Items”的数组元素,它可以包含抽象“Item”的子类。

[XmlArray("Items")]
public Item [] Items { get; set; }

现在我需要添加XmlArrayItem,但这个数字不是“固定的”。我们使用到目前为止的反射来查找具有KnownTypeProvider的所有子类,因此很容易使用新的子类型扩展程序集。我真的不想在这里对所有项目进行硬编码。

相应地定义了类:

[XmlRoot]
[KnownType("GetKnownTypes")]
public class Envelope {

但它没有帮助。

将项目更改为:

[XmlArray("Items")]
[XmlArrayItem(typeof(Item))]
public Item [] Items { get; set; }

结果:

  

{“类型   xxx.Adjustment   没想到。使用XmlInclude   或指定SoapInclude属性   静态未知的类型。“}

在打字时要序列化。

任何人都知道如何使用XmlInclude指向已知的类型提供程序?

2 个答案:

答案 0 :(得分:2)

KnownTypesAttribute不适用于XmlSerializer。它仅由DataContractSerializer使用。我很确定你可以在WCF中交换序列化器,因为我已经为DataContractSerializer做了这个。但如果这不是一个选项,你必须自己实现IXmlSerializable并在那里处理类型查找。

在取消此解决方案之前:您只需要为替换Item []的特殊类实现IXmlSerializable。其他所有内容都可以由默认的序列化程序处理。

答案 1 :(得分:1)

根据:http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/83181d16-a048-44e5-b675-a0e8ef82f5b7/

您可以使用不同的 XmlSerializer 构造函数:

new XmlSerializer(typeof(Base), new Type[] { typeof(Derived1), ..});

而不是枚举基本定义中的所有派生类,如下所示:

[System.Xml.Serialization.XmlInclude(typeof(Derived1))]
[System.Xml.Serialization.XmlInclude(typeof(Derived2))]
[System.Xml.Serialization.XmlInclude(typeof(DerivedN))]

我认为您应该可以使用 KnownTypeProvider 来填充 XmlSerializer 的构造函数中的数组。