开始:这也适用于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指向已知的类型提供程序?
答案 0 :(得分:2)
KnownTypesAttribute不适用于XmlSerializer。它仅由DataContractSerializer使用。我很确定你可以在WCF中交换序列化器,因为我已经为DataContractSerializer做了这个。但如果这不是一个选项,你必须自己实现IXmlSerializable并在那里处理类型查找。
在取消此解决方案之前:您只需要为替换Item []的特殊类实现IXmlSerializable。其他所有内容都可以由默认的序列化程序处理。
答案 1 :(得分:1)
您可以使用不同的 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 的构造函数中的数组。