Ds-сериализация Xml в массив / список объектов POCO на C#

#c# #.net #xml-serialization

#c# #.net #xml-сериализация

Вопрос:

У меня есть XML-файлы в следующем формате:

 <?xml version=""1.0"" encoding=""UTF-8""?>
            <Options>
               <Header>
                  <H1>A</H1>
                  <H2>B</H2>
                  <H3>C</H3>
                </Header>
               <Include>
                  <Option A1="something" A2="something">SomeValue</Option>
                  <Option A1="something" A2="something">SomeOtherValue</Option>
               </Include>
            </Options>
 

Мне удалось использовать сериализатор для десериализации заголовков, но возникли проблемы с опциями. В частности, у меня есть следующие объекты C #:

     [XmlRoot(ElementName="Option")]
    public class Option {
        [XmlAttribute(AttributeName="A1")]
        public string A1 { get; set; }
        [XmlAttribute(AttributeName="A2")]
        public string A2 { get; set; }
        [XmlText]
        public string Text { get; set; }
    }

    [XmlRoot(ElementName="Include")]
    public class OptionList {
        [XmlArrayItem("Option")]
        public List<Option> Options { get; set; }
    }
 

И я использую этот сериализатор для преобразования:

         public IReadOnlyList<Option> ParseInclude(string xmlDocument)
        {
            using (var reader = new XmlTextReader(new StringReader(xmlDocument)))
            {
                var serializer = new XmlSerializer(typeof(OptionList));
                reader.ReadToFollowing("Include");
                var collection = (OptionList) serializer.Deserialize(reader);
                return collection .Options ;
            }
        }
 

Но я не могу заставить это работать — я постоянно получаю исключение NullReferenceException в операторе return, потому Options что это null . Есть идеи?

Комментарии:

1. Ваш параметр класса должен быть включен.

2. @jdweng что вы подразумеваете под включением?

Ответ №1:

Попробуйте выполнить следующее :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:temptest.xml";
        static void Main(string[] args)
        {
            string xmlDocument = File.ReadAllText(FILENAME);
            using (XmlReader reader = XmlReader.Create(new StringReader(xmlDocument)))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Option));
                Option collection = (Option)serializer.Deserialize(reader);
            }
        }
    }
    [XmlRoot(ElementName = "Options")]
    public class Option
    {
        public Header Header { get; set; }
        [XmlArray("Include")]
        [XmlArrayItem("Option")]
        public List<OptionList> Options { get; set; }
    }
    public class Header
    {
        public string H1 { get; set; }
        public string H2 { get; set; }
        public string H3 { get; set; }
    }
    public class OptionList
    {
        [XmlAttribute(AttributeName = "A1")]
        public string A1 { get; set; }
        [XmlAttribute(AttributeName = "A2")]
        public string A2 { get; set; }
        [XmlText]
        public string Text { get; set; }
    }
}
 

Комментарии:

1. Не причина, по которой это не должно работать. Он был полностью протестирован.