2010-05-24 2 views
3

목록에 enum 속성이있는 개체가 들어있는 목록 속성이 포함 된 클래스가 있습니다. 나는이를 직렬화 할 때. NET Xml Serialization에서 속성 값을 기반으로 다른 태그를 사용하여 enum 속성을 사용하여 클래스를 직렬화 할 수 있습니까?

, 그것은 다음과 같습니다

<?xml version="1.0" encoding="ibm850"?> 
<test> 
    <events> 
    <test-event type="changing" /> 
    <test-event type="changed" /> 
    </events> 
</test> 

는, XML은 다음과 같이 갈 수는 속성을 통해, 수, 또는 유사한가요?

<?xml version="1.0" encoding="ibm850"?> 
<test> 
    <events> 
    <changing /> 
    <changed /> 
    </events> 
</test> 

기본적으로 태그 이름을 결정하는 방법으로 enum의 속성 값을 사용 하시겠습니까? 유일한 방법은 클래스 계층 구조 (즉, 속성 값을 사용하는 대신 하위 클래스 만들기)를 사용하고 있습니까?

편집 : 테스트를 마친 후에도 클래스 계층 구조가 실제로 작동하지 않는 것처럼 보입니다. 클래스를 구조화하여 원하는 출력을 얻는 방법이 있다면 하위 클래스를 사용하는 경우에도 허용되는 대답입니다. 여기

는 (그렇지 않으면 프로그램 창이 즉시 종료됩니다, 비주얼 스튜디오에서 실행되도록 Ctrl + F5를 명중하는 기억) 출력 위의 XML을하는 샘플 프로그램입니다 :

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

namespace ConsoleApplication18 
{ 
    public enum TestEventTypes 
    { 
     [XmlEnum("changing")] 
     Changing, 

     [XmlEnum("changed")] 
     Changed 
    } 
    [XmlType("test-event")] 
    public class TestEvent 
    { 
     [XmlAttribute("type")] 
     public TestEventTypes Type { get; set; } 
    } 
    [XmlType("test")] 
    public class Test 
    { 
     private List<TestEvent> _Events = new List<TestEvent>(); 

     [XmlArray("events")] 
     public List<TestEvent> Events { get { return _Events; } } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Test test = new Test(); 
      test.Events.Add(new TestEvent { Type = TestEventTypes.Changing }); 
      test.Events.Add(new TestEvent { Type = TestEventTypes.Changed }); 

      XmlSerializer serializer = new XmlSerializer(typeof(Test)); 
      XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); 
      serializer.Serialize(Console.Out, test, ns); 
     } 
    } 
} 

답변

0

이 같은 무언가를 생각할 겁니다 XmlType 메타 태그에서는 사용할 수 없습니다. DataContractSerializer 클래스를 살펴보면 더 많은 행운을 얻게 될 것입니다. OnSerializing 이벤트를 재정의 할 수도 있지만 작동하지 않을 것이라고 생각합니다.

1
public class Test : IXmlSerializable 
    { 
     private List<TestEvent> _Events = new List<TestEvent>(); 

     public List<TestEvent> Events { get { return _Events; } } 

     #region IXmlSerializable Members 

     public System.Xml.Schema.XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(System.Xml.XmlReader reader) 
     { 
      throw new NotImplementedException(); 
     } 

     public void WriteXml(System.Xml.XmlWriter writer) 
     { 
      writer.WriteStartElement("events"); 
      foreach (var item in Events) 
      { 
       writer.WriteElementString(item.Type.ToString().ToLower(), ""); 
      } 
      writer.WriteEndElement(); 
     } 

     #endregion 
    } 

Test 클래스를이 클래스로 변경하면 원하는 출력이 생성됩니다. 유일한 문제는 내가 테스트 클래스 대신 XmlType 태그를 사용하여 셀 룰 라이즈를 오버라이드 할 때 이름이 테스트 대신 테스트가 될 수 있다고 생각하지 않는다는 것입니다.