Десериализация XDocument не работает - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть этот код:

[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

Но десериализация не работает. Пожалуйста помоги. Спасибо!

1 Ответ

1 голос
/ 06 сентября 2011

Я полагаю, что вы хотите использовать 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, так как он может иметь значение null (смотрите ANTARCTICA).Вы не можете десериализовать прямо в int ?, так что вам придется либо сделать его строкой, либо перейти через другое свойство, посмотрите этот вопрос для получения дополнительной информации.

...