XDocument的反序列化不起作用

时间:2011-09-06 10:40:19

标签: c#-4.0 linq-to-xml xml-deserialization

我有这段代码:

[Serializable]
    [XmlRoot("ISO_CCY_CODES")]
    public class IsoCurrencyCodes
    {
        public IsoCurrencyCodes()
        {
            IsoCodes = new List<IsoCurrencyCode>();
        }

        public IsoCurrencyCodes(List<IsoCurrencyCode> isoCodes)
        {
            IsoCodes = isoCodes;
        }


        [XmlArrayItem("ISO_CURRENCY")]
        public List<IsoCurrencyCode> IsoCodes { get; set; }

        public static IEnumerable<IsoCurrencyCode> Get()
        {
            var doc = XDocument.Parse(XmlStringIsoCodes.XmlSource.Replace("\r\n", ""));
            var res = doc.Deserialize<IsoCurrencyCodes>();
            return res.IsoCodes;
        }
    }

    [Serializable]
    [XmlRoot("ISO_CURRENCY")]
    public class IsoCurrencyCode
    {
        public IsoCurrencyCode()
        {
        }

        [XmlElement(ElementName = "ENTITY")]
        public string Entity { get; set; }

        [XmlElement(ElementName = "CURRENCY")]
        public string Currency { get; set; }

        [XmlElement(ElementName = "ALPHABETIC_CODE")]
        public string Alpha_Code3 { get; set; }

        [XmlElement(ElementName = "NUMERIC_CODE")]
        public int NumCode { get; set; }

        [XmlElement(ElementName = "MINOR_UNIT")]
        public string MinorUnit { get; set; }
    }

这段代码,用于反序列化:

public static XDocument Serialize<T>(this T source)
        {
            var ser = new XmlSerializer(source.GetType());
            var sb = new StringBuilder();
            using (var writer = new StringWriter(sb))
            {
                ser.Serialize(writer, source);
            }
            return XDocument.Parse(sb.ToString());
        }

        public static T Deserialize<T>(this XDocument xmlDocument)
        {
            var xmlSerializer = new XmlSerializer(typeof (T));
            using (var reader = xmlDocument.CreateReader())
                return (T) xmlSerializer.Deserialize(reader);
        }

这是XML source

但是反序列化不起作用。请帮忙。 谢谢!

1 个答案:

答案 0 :(得分:1)

我相信你只想使用XMLArray,如果你有一个集合元素可以放在下面的所有项目。例如,它可以是ISO_CURRENCIES。我假设你不能在这种情况下更改源代码,所以只需使用它:

[XmlElement("ISO_CURRENCY")]
public List<IsoCurrencyCode> IsoCodes { get; set; }

你应该发现它有用。

此外,如果您发现在获取反序列化类方面存在进一步的问题,可以从XML自动生成它们,然后您可以查看创建的代码:

xsd source.xml
xsd source.xsd /c

这将创建source.cs,然后您可以在项目中使用它或适应您自己的用途。

进一步说明,你会发现你不能将int用于Minor_Unit,因为它可以为空(看看ANTARCTICA)。您不能直接反序列化为int?,因此您要么必须将其设为字符串,要么通过其他属性,请查看this question以获取更多信息。