我有一个我正在使用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>
答案 0 :(得分:24)
Inherited
属性只表示属性可以继承,而不是 。例如,如果查看MemberInfo.GetCustomAttributes
的类型签名,这是检索这些属性的最常用方法,则会出现此重载:
public abstract Object[] GetCustomAttributes(bool inherit)
如果参数inherit
是true
,那么该方法将搜索继承链,即它将查看基类或任何祖先类是否具有该属性,如果特定类型是看着没有。为了使此方法在继承的类上查找属性,属性类本身不能设置AttributeUsage.Inherited = false
。
但是,如果属性的AttributeUsage.Inherited
为true
,则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 在基类中查找属性,即使这些属性是“可继承的”。