2010-01-16 2 views
11

클래스가 있습니다. C#의 XmlSerializer으로 직렬화됩니다. XmlRoot 특성으로 표시되어 있으며 파생 클래스에서이 특성을 상속하고 싶습니다.XmlRootAttribute는 상속받을 수 있습니까?

설명서를 보면 XmlRoot가 AttributeUsageAttribute (Inherit는 기본적으로 true로 설정되어 있음)로 상속을 설정하지만 XmlRoot 특성없이 상속 된 클래스를 deserialize 할 때 오류가 발생한다고하지는 않습니다 ("< 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; } 
} 

는 XML 나는 InheritedClass로 역 직렬화 할 수는 다음과 같습니다

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

답변

21

Inherited은 단순히 속성 이 상속 될 수 있으며, 이됩니다. 매개 변수 inherittrue입니다

public abstract Object[] GetCustomAttributes(bool inherit) 

경우 다음 방법은 상속을 검색합니다 :이 속성을 검색 할 수있는 가장 일반적인 방법입니다 MemberInfo.GetCustomAttributes의 형태 서명을 보면 예를 들어,이 과부하가 있습니다 즉,보고있는 특정 유형이 아닌 경우 기본 클래스 또는 상위 클래스에 속성이 있는지 확인합니다. 이 메서드가 상속 된 클래스에서 특성을 찾으려면 특성 클래스 자체가 AttributeUsage.Inherited = false으로 설정되어서는 안됩니다. 속성의 AttributeUsage.InheritedtrueGetCustomAttributes 방법 경우 inherit 매개 변수가 false 경우

그러나, 여전히 그것을 무시합니다. 즉

AttributeUsage.Inherited허가 아닌 요구 사항입니다. 상속 된 속성을 가져올 지 여부를 결정하는 것은 GetCustomAttributes (또는 비슷한 방법)을 호출하는 사람에게 완전히 달려 있습니다. 당신은 이것을 통제 할 수 없습니다. 나는 XmlSerializer이 상속 된 속성을 찾지 않는다는 것을 확신한다.

아마도 당신이 찾고 있던 대답이 아니 겠지만 거기에 있습니다. 이미 해결 방법을 찾은 것처럼 보입니다.

덧붙여 말하자면 XML 직렬화에서 작동하는 방식은 을 사용하고 XmlAttributes이라는 인스턴스를 얻는 것입니다. 다음은 생성자 (리플렉터에서) XmlAttributes에 대한 모습입니다 :

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

그래서 당신이 실제로 GetCustomAttributes 방법에 거짓을 통과 않는 것을 볼 수 있습니다; 이 아님은 속성이 "상속 가능"인 경우에도 기본 클래스에서 속성을 찾습니다."

+1

철저한 응답으로 배경을 고맙게 생각합니다. 감사합니다. –

관련 문제