2

次のような 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 の代わりに " を使用して回答を求めます。

4

2 に答える 2

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; }
}
于 2012-06-23T01:19:13.260 に答える
2

本当に基本的な例として、これを見ることができます:

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

于 2012-06-23T01:17:17.843 に答える