XmlRootAttribute是可继承的吗?

时间:2010-01-16 02:54:27

标签: c# inheritance attributes xmlserializer

我有一个我正在使用C#XmlSerializer序列化的课程。它标有XmlRoot属性,我想在派生类中继承此属性。

查看文档时,它没有说XmlRoot使用AttributeUsageAttribute将Inherit设置为false(Inherit应该默认为true),但是在尝试反序列化没有XmlRoot属性的继承类时出错(“< rootNode xmlns =''>不是预期的。“)。

目前有效:

[Serializable()]
[XmlRoot("rootNode")]
public class BaseClass
{
    [XmlAttribute("attributeA")]
    public int A { get; set; }
}

[Serializable()]
[XmlRoot("rootNode")]
public class InheritedClass : BaseClass
{
    [XmlElement("elementB")]
    public int B { get; set; }
}

这不起作用,但却是我想要的:

[Serializable()]
[XmlRoot("rootNode")]
public class BaseClass
{
    [XmlAttribute("attributeA")]
    public int A { get; set; }
}

[Serializable()]
public class InheritedClass : BaseClass
{
    [XmlElement("elementB")]
    public int B { get; set; }
}

我可能尝试反序列化为InheritedClass的XML如下所示:

<rootNode attributeA="abc">
    <elementB>123</elementB>
</rootNode>

1 个答案:

答案 0 :(得分:24)

Inherited属性只表示属性可以继承,而不是 。例如,如果查看MemberInfo.GetCustomAttributes的类型签名,这是检索这些属性的最常用方法,则会出现此重载:

public abstract Object[] GetCustomAttributes(bool inherit)

如果参数inherittrue,那么该方法将搜索继承链,即它将查看基类或任何祖先类是否具有该属性,如果特定类型是看着没有。为了使此方法在继承的类上查找属性,属性类本身不能设置AttributeUsage.Inherited = false

但是,如果属性的AttributeUsage.Inheritedtrue,则GetCustomAttributes方法仍会忽略inherit参数为false。< /强>

换句话说,AttributeUsage.Inherited权限,而不是要求。完全由任何人调用GetCustomAttributes(或类似方法)来决定是否获取继承属性。你无法控制它。我非常肯定(不是100%肯定)XmlSerializer没有寻找继承属性。

也许不是你想要的答案,但你在那里;看起来你已经找到了解决方法。

顺便提一下,它与XML序列化一起使用的方式是XmlSerializer使用XmlReflectionImporter,后者又获取XmlAttributes的实例。以下是XmlAttributes(在Reflector之外)的构造函数:

public XmlAttributes(ICustomAttributeProvider provider)
{
    this.xmlElements = new XmlElementAttributes();
    this.xmlArrayItems = new XmlArrayItemAttributes();
    this.xmlAnyElements = new XmlAnyElementAttributes();
    object[] customAttributes = provider.GetCustomAttributes(false);
    ...
}

所以你可以看到它确实将 false 传递给GetCustomAttributes方法;它 not 在基类中查找属性,即使这些属性是“可继承的”。