我有一个带有抽象基类的类的C#结构,以及从这个抽象类派生的各种类。
[System.Xml.Serialization.XmlInclude(typeof(B))]
public abstract class A {
...
}
[Serializable]
[XmlType("typename")]
public class B : A {
...
}
此外,我在另一个类C中使用类B的实例作为其抽象类型的字段,如下所示:
public class C {
...
public A myItem { get; set; } //A is actually of type B
...
}
现在,当我通过标准xmlserializer序列化我的类C时,我得到一个这样的XML结构:
<C>
<myItem p2:type="typename" xmlns:p2="...">
... //Fields as elements and stuff
</myItem>
</C>
但这不是我需要的,因为我将这些序列化的C对象发送到REST Web服务(它还没有有效的模式)。我真正需要的是这样的事情:
<C>
<typename>
... //Fields as elements and stuff
</typename>
</C>
但正如您在上面所看到的,xmlserializer似乎更喜欢实例字段名称而不是通过XmlType设置的类型名称。另外,显然我不能在C中的字段中使用XmlElement(“typename”),因为我不知道该字段将包含哪个抽象类A的具体实现。
有没有人遇到类似的问题并能为我提供解决方案?或者我是否真的需要在我的类A中实现IXmlSerializable,因此在我的所有具体的A派生类中实现这一点?
编辑:在阅读一些文章时发现,IXmlSerializable不允许我控制包装元素,所以我实际上需要在C类中使用某种switch()实现接口关于myItem成员的类型?
感谢您的帮助!
祝你好运, FLO
答案 0 :(得分:2)
好的,似乎我找到了解决方案,至少对于序列化,还不知道这是否也适用于反序列化。键是XMLElement属性的特殊构造函数,它允许指定在使用抽象类型时使用的键:
http://msdn.microsoft.com/en-us/library/cz6bdh5z.aspx
也许这对其他人也有帮助。
最佳, FLO
答案 1 :(得分:0)
对于反序列化,您需要为XmlSerializer提供它在所有抽象类型属性中可能遇到的所有类型。
XmlSerializer有一个特定的构造函数,您可以在其中为其提供一组类型。