【问题标题】:Is XmlRootAttribute inheritable?XmlRootAttribute 是可继承的吗?
【发布时间】:2011-01-05 18:28:50
【问题描述】:

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

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

目前有效:

[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>

【问题讨论】:

    标签: c# inheritance attributes xmlserializer


    【解决方案1】:

    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,而 XmlReflectionImporter 反过来又获得了 XmlAttributes 的实例。以下是 XmlAttributes 的构造函数(反射器外):

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

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

    【讨论】:

    • 彻底的回应,我很欣赏背景。谢谢!
    • 也不是我希望的答案,但至少是一个明确的答案。感谢您的详尽解释。
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多