C# 4.0 XDocument的反序列化不&x27;行不通

C# 4.0 XDocument的反序列化不&x27;行不通,c#-4.0,linq-to-xml,xml-deserialization,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<Iso

我有以下代码:

[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; }
    }
[可序列化]
[XmlRoot(“ISO_CCY_代码”)]
公共类等流码
{
公共等币种代码()
{
等代码=新列表();
}
公共等电流代码(列表等电流代码)
{
等代码=等代码;
}
[XmlArrayItem(“ISO_货币”)]
公共列表等位码{get;set;}
公共静态IEnumerable Get()
{
var doc=XDocument.Parse(XmlStringIsoCodes.XmlSource.Replace(“\r\n”,”);
var res=doc.Deserialize();
返回分辨率等电位线;
}
}
[可序列化]
[XmlRoot(“ISO_货币”)]
公共类等流码
{
公共等币种代码()
{
}
[xmlement(ElementName=“ENTITY”)]
公共字符串实体{get;set;}
[xmlement(ElementName=“CURRENCY”)]
公共字符串货币{get;set;}
[xmlement(ElementName=“字母代码”)]
公共字符串Alpha_代码3{get;set;}
[XmlElement(ElementName=“数字代码”)]
公共整数NumCode{get;set;}
[XmlElement(ElementName=“次要单位”)]
公共字符串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);
        }
公共静态XDocument序列化(此T源代码)
{
var ser=新的XmlSerializer(source.GetType());
var sb=新的StringBuilder();
使用(var编写器=新的StringWriter(sb))
{
序列化(编写器、源);
}
返回XDocument.Parse(sb.ToString());
}
公共静态T反序列化(此XDocument xmlDocument)
{
var xmlSerializer=新的xmlSerializer(typeof(T));
使用(var reader=xmlDocument.CreateReader())
返回(T)xmlSerializer.Deserialize(读取器);
}
这是

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

我相信,只有在所有项都有一个集合元素的情况下,才需要使用XMLArray。例如,这里可能是ISO_货币。在这种情况下,我假设您无法更改源代码,因此只需使用此代码即可:

[XmlElement("ISO_CURRENCY")]
public List<IsoCurrencyCode> IsoCodes { get; set; }
这将创建source.cs,您可以在项目中使用它,也可以根据自己的用途进行调整

作为进一步的说明,您将发现不能对Minor_单位使用
int
,因为它可以为null(看看南极洲)。您不能直接反序列化为int?,因此您必须将其设置为字符串或通过另一个属性,有关详细信息,请参阅

xsd source.xml
xsd source.xsd /c