2011-09-06 102 views
0

我有这样的代码:反序列化的XDocument不起作用

[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

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

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

你应该发现这样的作品。

此外,如果你发现你在获得反序列化类的权利,你可以让他们自动生成你从XML进一步的问题,然后你可以看看所创建的代码:

xsd source.xml 
xsd source.xsd /c 

这将创建source.cs,然后您可以在您的项目中使用它或根据自己的用途进行调整。

作为进一步的说明,你会发现你不能使用Minor_Unit的int,因为它是可以空的(看看ANTARCTICA)。你不能直接反序列化为int,所以你要么必须把它设为一个字符串,要么通过另一个属性,查看this question了解更多信息。