2009-06-24 4 views
7

상속 된 회원에게 속성을 적용 할 수 있습니까?

이제 다음과 같은 작업을 수행하려고합니다.

public class PathValue : Simple 
{ 
    [XmlAttribute("path")] 
    public string Value { get; set; } 
} 

public class ObjectValue : Simple 
{ 
    [XmlAttribute("object")] 
    public string Value { get; set; } 
} 

그러나 실제로 속성을 재정의하지 않습니다. 기본 클래스의 멤버에 특성을 적용하려고합니다. 이것이 가능한가?

실제 문제는 XML에서 (매우 훌륭하게 작동하는) 직렬화 메커니즘에서 속성의 이름 만 다른 유사한 요소를 많이 발견한다는 것입니다. 일관성이 없으며, 제어 형식). 지금은 각 요소에 대해 다른 클래스를 만들어야하지만 반면에 그들은 100 % 동일합니다 (속성을 제외하고).

가능하지 않다고 생각하지만 결코 알지 못할 수도 있습니다.

업데이트 :

Marc의 접근 방식을 시도했지만 아무 소용이 없습니다.

public class Document 
{ 
    public PathValue Path; 
    public ObjectValue Object; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var doc = new Document() 
     { 
      Path = new PathValue() { Value = "some path" }, 
      Object = new ObjectValue() { Value = "some object" } 
     }; 

     XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 

     overrides.Add(typeof(PathValue), "Value", new XmlAttributes() { XmlAttribute = new XmlAttributeAttribute("path") }); 
     overrides.Add(typeof(ObjectValue), "Value", new XmlAttributes() { XmlAttribute = new XmlAttributeAttribute("object") }); 

     XmlSerializer serializer = new XmlSerializer(typeof(Document), overrides); 

     serializer.Serialize(Console.Out, doc); 

     Console.WriteLine(); 
     Console.ReadLine(); 
    } 
} 

... 트릭을 수행하지 않습니다.

+0

당신은 Simple에서 상속받을 생각이었습니다. – Noldorin

+0

단일 xml 파일에 요소가 모두 포함될 수 있다는 것을 의미합니까? 모든 값 속성을 사용하여 값 클래스에 직렬화해야합니까? – Groo

+0

그들은 분명히 파생 클래스에 직렬화해야하며, 요소 자체의 이름은 사용 된 위치에 따라 다르지만 일반적 아이디어입니다. 또한 내 응용 프로그램에서는 그것을 읽는 것보다 XML을 작성하는 것이 더 일반적으로 사용됩니다. –

답변

3

나는이 질문에 직접 답할 것이므로이 대답을 받아 들일 수 있습니다. 나는 그 대답을 좋아하지 않지만 그것이 유일하게 유효한 대답이라고 생각한다.

대답은 다음과 같습니다. 아니, 할 수 없습니다.이것에 대해

2

런타임시 적용 할 속성을 전달할 수있는 오버로드 XmlSerializer 생성자를 사용할 수 있습니까? 그렇다면 걱정할 필요가 없습니다 ...

경고 : serializer 인스턴스를 캐싱하고 다시 사용하려고합니다. 그렇지 않으면 (복합 생성자로) 매번 동적 유형 생성을 수행합니다.

예 :

using System; 
using System.Xml.Serialization; 
public class Simple { 
    public string Value { get; set; } 

    static void Main() { 
     XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
     overrides.Add(typeof(Simple), "Value", new XmlAttributes { 
      XmlAttribute = new XmlAttributeAttribute("path") 
     }); 
     XmlSerializer pathSerializer = new XmlSerializer(
      typeof(Simple), overrides); 
     // cache and re-use pathSerializer!!! 

     Simple obj = new Simple(); 
     obj.Value = "abc"; 
     pathSerializer.Serialize(Console.Out, obj); 
    } 
} 

출력 :

<Simple xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" path="abc" /> 
+0

그게 효과가 있지만, 파생 클래스에 대한 재정의를 지정할 수 없습니다. 따라서 각 속성에 대한 이름이 다른 각 인스턴스에 대해 serializer가 있어야하며 모든 다른 요소는 동일한 문서에 나타날 수 있습니다. –

0

당신이 아마 알고 있지만, 아이디어로 (코드 구조가 완전히 그 경우에 변경 것이지만) :

한 가지 방법은 기본 클래스를 사용자 지정 직렬화를 사용하여 이름 - 값 쌍의 컬렉션으로 serialize하는 것입니다 (XDocument 및 이와 유사한 도움이되는 항목도 더 쉽게 사용할 수 있습니다). 유형 안전을 강요하지는 않지만 많은 수동 작업을하지 않아도됩니다.

더 넓은 범위의 가능성을 허용하기 때문에 사용자 지정 직렬화를 선호합니다 (예 : 불변 클래스 직렬화). XmlSerializer도 때로는 정말 불쾌합니다 (예 : "MyFieldSpecified"속성을 추가하여 선택적 속성을 만드는 것이 싫음).

+0

제 응용 프로그램에는 XML 생성을위한 특수 모델이 있습니다. 즉, 우리는 "도메인 모델"과 "XML 모델"을 가지고 있으며 두 모델은 실제로 분리되어 있습니다. XmlSerializer의 사용자 지정 가능성 때문에 XmlWriter를 사용하여 XML 파일을 생성하는 데이 방법을 사용하기로 결정했습니다. 도메인 모델은 BinaryFormatter를 사용하여 직렬화됩니다. –

0

아마도 기본 클래스 속성을 공통 매핑으로 표시 할 수 있습니다. 상속 된 클래스의 속성 만 다른 위치에 겹쳐 쓸 수도 있습니다. 최소한 당신은 약간의 무시를 저장할 것입니다.

1

방법 :

public class Simple 
{ 
    [XmlIgnore] 
    public string Value { get; set; } 
} 

public class PathValue : Simple 
{ 
    [XmlAttribute("path")] 
    public string Path { 
      get { return base.Value != null ? base.Value : null; } 
      set { base.Value = value != null ? value : null; } 
    } 
} 

public class ObjectValue : Simple 
{ 
    [XmlAttribute("object")] 
    public string Object { 
      get { return base.Value != null ? base.Value : null; } 
      set { base.Value = value != null ? value : null; } 
    } 
} 

이 생성자의 직렬화 형식을 취하는 열린 같은 unserializable 유형을 직렬화하는 데 사용되는 동일한 기술이다.

+0

아직 속성을 재정의하고 있습니다. –

관련 문제