2010-05-18 2 views
0

수업 구조는 다음과 같습니다. 즉, 나는 각 대중을위한 APPEND "유형"속성을하고자 다음과 같이 내가 위의 클래스를 직렬화 할 때C#의 직렬화

[Serializable] 
[XmlRootAttribute("person", Namespace = "", IsNullable = false)] 
public class Person : IDisposable 
{ 
     Private int _id; 
     Private string _name; 

     [XmlElement(“id”)] 
     Public int Id 
     { 
      Get{ return _id;} 
      Set{ _id = value;} 
     } 

     [XmlElement(“name”)] 
     Public string Name 
     { 
      Get{return _name;} 
      Set{_name = value;} 
     } 
} 

내가

<person> 
<id>1</id> 
    <name>Test</name> 
</person> 

이제 다음 XML을 얻고, 위 클래스를 직렬화하고 싶습니다 xml 요소로 직렬화되는 속성. "[XmlAttribute ("type ")]"다른 공용 속성 "형식"을 선언하여 "사람"노드에 "형식"특성을 추가 할 수 있지만 XML 요소로 serialize 된 각 공용 속성에 대해 동일한 달성하고 싶습니다. 어떤 생각 아래에 달성하기 위해 :

<person type=”Person”> 
    <id type=”int”>1</id> 
    <name type=”string”>Test</name> 
</person> 

답변

2

중요한 일이 오면 내 마음은 다음과 같습니다 예를 Typed<T>의 이름을 딴 제네릭 클래스, 만드는 것입니다으로 : 다음

[Serializable] 
    public class Typed<T> 
    { 
     public Typed() 
     { 
     } 

     public Typed(T value) 
     { 
      this.Value = value; 
     } 

     [XmlText] 
     public T Value { get; set; } 

     [XmlAttribute("Type")] 
     public String Type 
     { 
      get 
      { 
       return typeof(T).Name; 
      } 
      set 
      { 
       // Skipped for clarity 
      } 
     } 
    } 

당신의 Public int IdPublic Typed<int> Id이됩니다. xml 파서에 대한 대리자를 포함하는이 작업을 수행하는 또 다른 방법이있을 수 있지만 지금 당장이 작업이 내 머리 위에 있습니다.

+0

+1 미친 대안! ... 형식화 된 에서 T로 암시 적 변환을 추가하면 더 간단한 사용법을 얻을 수 있습니다. – eglasius

0

Ivan의 답변은 훌륭하고 독창적이지만 터치하고 싶지 않은 코드를 리팩터링 할 수 있습니다. 이 경우 IXmlSerializable을 구현하는 것이 좋습니다. XmlWriterXmlReader으로 직접 작업하는 것이지만,이 클래스로 작업 할 때의 함정 (특히 XmlReader)을 알고있는 한 그리 좋지는 않지만 XML 형식을 최대한 제어 할 수 있습니다.

당신이 공상을 얻고 싶은 경우에 당신도 유형을 사용/추가 IXmlSerializable를 구현하고/형식 XML을 읽는 방법을 결정하기 위해 [Xml...]T의 속성과 그 구성원을 얻기 위해 반사를 사용하는 XmlSerializationWrapper<T>을 쓸 수 속성 그러나 그 시점에서 Ivan의 솔루션을 사용하는 것이 덜 바람직 할 것입니다.

+0

소리가 창조적입니다. 나는 그것을 시도 할 수 있지만 그때 나는 모든 내장 된 유형을 장식해야한다. 이게 가야 할 길인가? –

+0

일반적인 방법을 사용했다면 기본 제공 형식으로 꾸밀 필요가 있는지 여부는 serializable 멤버 검색을 구현하는 방법에 따라 달라집니다. 프레임 워크 직렬화와 같은 방식으로 처리하는 경향이 있습니다. 속성이 XML 특성으로 장식 된 경우 특성에 표시된대로 직렬화합니다. XmlIgnore로 장식 된 경우에는 직렬화하지 마십시오. 꾸며지지 않은 경우 노드 이름으로 등록 정보의 이름을 사용하여 직렬화하십시오. type 속성을 추가하는 것은 typeof (property) .Name을 쓰는 것입니다. – allonym