2012-06-23 67 views
2

我想有存儲在XML我的數據是這樣的:C#反序列化遞歸類

<MyType name="A"> 
    <MyType name="B" /> 
    <MyType name="E" /> 
    <MyType name="C"> 
    <MyType name="D"> 
    <MyType name="G"> 
    </MyType> 
</MyType> 

的MyType應該是包含其他MyType的實例的數組類。是否有可能像這樣反序列化一個類(使用System.Xml.Serialization.XmlSerializer)還是必須使用我自己的解析器加載它?

此外,是否有可能反序列化自定義標題的XML,即。 「,而不是TY答案

+1

JSON.NET,沒有更多的補充。 – Dementic

回答

1

作爲一個非常簡單的例子,你可以看看這個:?

注意(在XML心不是很喜歡你所描述的東西,但你需要用XML屬性搗鼓得到它做你想要什麼,但在結構上它代表着你所要求的,即該方案是這是可能的)

class Program 
    { 
     static void Main(string[] args) 
     { 
      var mytypeTest = new MyType 
      { 
       Name = "a", 
       MyTypes = new List<MyType> 
       { 
        new MyType 
        { 
         Name = "b" 
        } 
       }.ToArray() 
      }; 

      var xml = mytypeTest.Serialize(); 

      var result = xml.Deserialize<MyType>(); 
     } 
    } 

    public class MyType 
    { 
     [XmlAttribute] 
     public string Name { get; set; } 
     [XmlElement(ElementName="MyType")] 
     public MyType[] MyTypes { get; set; } 
    } 

    public static class XmlSerializerExtensions 
    { 
     public static T Deserialize<T>(this string xml) where T : new() 
     { 
      var _serializer = new XmlSerializer(typeof(T)); 
      using (var _stringReader = new StringReader(xml)) 
      { 
       using (XmlReader _reader = new XmlTextReader(_stringReader)) 
       { 
        return (T)_serializer.Deserialize(_reader); 
       } 
      } 
     } 

     public static string Serialize<T>(this T value) where T : new() 
     { 
      var _serializer = new XmlSerializer(typeof(T)); 
      using (var _stream = new MemoryStream()) 
      { 
       using (var _writer = new XmlTextWriter(_stream, new UTF8Encoding())) 
       { 
        _serializer.Serialize(_writer, value); 
        return Encoding.UTF8.GetString(_stream.ToArray()); 
       } 
      } 
     } 
    } 

3

我認爲xml不正確。 D和G不關閉。 與該XML,

<MyType name="A"> 
<MyType name="B" /> 
<MyType name="E" /> 
<MyType name="C"> 
    <MyType name="D" /> 
    <MyType name="G" />   
</MyType> 
</MyType> 

你可以使用這個類來反序列化:

[Serializable] 
public class MyType 
{ 
    [XmlElement(ElementName="MyType")] 
    public List<MyType> Types { get; set; } 

    [XmlAttribute(AttributeName="name")] 
    public string Name { get; set; } 
}