3

xml文字列を次のように定義された型クラスのオブジェクトにデシリアライズしたい

   [Serializable]
    [XmlRoot("rt")]
    public class XMLSessionParameters
    {
        [XmlArrayItem("el")]
        public List<Elements> Elements { get; set; }
    }

    public class Elements
    {
        [XmlAttribute("nm")]
        public string Name { get; set; }

        [XmlAttribute("vl")]
        public string Value { get; set; }
    }

以下は、デシリアライズしたい XML です。

<rt>
  <el nm="Name" vl="ABCD_test"/>
  <el nm="Dual" vl="AA"/>
  <el nm="Quad" vl="ABCD"/>
  <el nm="YYMMDD" vl="120614"/>
</rt>

以下は、XML文字列の逆シリアル化に使用しているメソッドです

public static XMLSessionParameters DeserializeSessionParameters(string xmlString)
    {
        XMLSessionParameters parameters = (XMLSessionParameters)Deserialize(typeof(XMLSessionParameters), xmlString);
        XElement root = XElement.Parse(xmlString);
        List<XElement> fileElements = root.Elements().ToList();
        foreach (XElement fileEle in fileElements)
        {
            string xml = fileEle.ToString();
            Elements ele = (Elements)Deserialize(typeof(Elements), xml);                
            parameters.Elements.Add(ele);
        }
        return parameters;
    }

private static object Deserialize(Type type, string XmlString)
{
    XmlSerializer serializer = new XmlSerializer(type);
    StringReader stringReader = new StringReader(XmlString);
    XmlReader xmlReader = new XmlTextReader(stringReader);
    object serializedObj = serializer.Deserialize(xmlReader);
    return serializedObj;
}

上記の XML を文字列として渡し、Deserialize 関数が呼び出されると、XMLReader オブジェクトは値を None として所有し、プログラムは例外を与えずに突然終了します。そのような行動の原因は何ですか?

4

1 に答える 1

6

xml がクラスと一致しません。必要なもの:

    [XmlElement("el")]
    public List<Elements> Elements { get; set; }

[XmlArrayItem](暗黙の を使用して[XmlArray])を使用すると、xmlで機能します。

<rt>
  <Elements>
    <el nm="Name" vl="ABCD_test"/>
    <el nm="Dual" vl="AA"/>
    <el nm="Quad" vl="ABCD"/>
    <el nm="YYMMDD" vl="120614"/>
  </Elements>
</rt>

Elements(余分なラッパー要素に注意してください)。[XmlElement]代わりに使用すると、これは削除されます。また: remove [Serializable]: XmlSerializer はそれを必要としません。

属性が正しいことを確認する簡単な方法: いくつかの典型的なオブジェクトを設定し、それらをシリアル化します。取得したものを必要な xml と比較します。


完全な例:

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

static class Program
{
    static void Main()
    {
        string xmlString = @"<rt>
  <el nm=""Name"" vl=""ABCD_test""/>
  <el nm=""Dual"" vl=""AA""/>
  <el nm=""Quad"" vl=""ABCD""/>
  <el nm=""YYMMDD"" vl=""120614""/>
</rt>";
        XMLSessionParameters parameters = (XMLSessionParameters)Deserialize(typeof(XMLSessionParameters), xmlString);
        // parameters now has 4 elements, all correctly configured
    }
    private static object Deserialize(Type type, string XmlString)
    {
        XmlSerializer serializer = new XmlSerializer(type);
        StringReader stringReader = new StringReader(XmlString);
        XmlReader xmlReader = new XmlTextReader(stringReader);
        object serializedObj = serializer.Deserialize(xmlReader);
        return serializedObj;
    }

}

[XmlRoot("rt")]
public class XMLSessionParameters
{
    [XmlElement("el")]
    public List<Elements> Elements { get; set; }
}

public class Elements
{
    [XmlAttribute("nm")]
    public string Name { get; set; }

    [XmlAttribute("vl")]
    public string Value { get; set; }
}
于 2012-06-14T06:38:40.303 に答える