2010-05-24 48 views
3

我有一個類,包含列表屬性,在列表中包含有一個枚舉屬性的對象。在.NET Xml序列化中,是否可以使用基於屬性值的具有不同標記的枚舉屬性對類進行序列化?

當我序列化此,它看起來像這樣:

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

基本上,使用枚舉的屬性值作爲一種方式來確定標籤名?使用類層次結構(即創建子類而不是使用屬性值)是唯一的方法嗎?

編輯:經過測試,似乎即使是一個類層次結構也不會實際工作。如果有一種方法來構造類以獲得我想要的輸出,即使是使用子類,也是可以接受的答案。

下面是一個示例程序,將輸出上面的XML(記得按Ctrl + F5在Visual Studio中運行,否則程序窗口會立即關閉):

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類更改爲此,它會生成您想要的輸出類型。唯一的問題是,當重寫seralization時,我不認爲你可以在Test類上使用XmlType標記,所以名稱將是Test而不是Test。

相關問題