在派生类上使用C#xmlserializer,同时控制生成的XML元素

时间:2010-11-26 12:21:14

标签: c# xml serialization c#-3.0 xml-serialization

我有一个带有抽象基类的类的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

2 个答案:

答案 0 :(得分:2)

好的,似乎我找到了解决方案,至少对于序列化,还不知道这是否也适用于反序列化。键是XMLElement属性的特殊构造函数,它允许指定在使用抽象类型时使用的键:

http://msdn.microsoft.com/en-us/library/cz6bdh5z.aspx

也许这对其他人也有帮助。

最佳, FLO

答案 1 :(得分:0)

对于反序列化,您需要为XmlSerializer提供它在所有抽象类型属性中可能遇到的所有类型。

XmlSerializer有一个特定的构造函数,您可以在其中为其提供一组类型。

相关问题