C#反序列化递归类

时间:2012-06-23 00:54:18

标签: c# xml recursion deserialization

我想将我的数据存储在这样的XML中:

<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的答案。

2 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:2)

作为一个非常基本的例子,您可以看一下:

注意(xml并不像你所描述的那样,但你需要摆弄xml属性才能让它完全符合你的要求,但结构上它代表了你要求的场景,即是的,这是可能的)< / p>

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());
                }
            }
        }
    }