Ответы с форумов MSDN

Десериализация списков из XML

Date: 08.02.2017 11:51:14

"Я создал ещё более простую по структуре XML'ку:"

Так не работает. Десериализация, в отличие от парсера, кушает только XML строго определенной структуры. Например: 

<?xml version="1.0"?>
<PrintEngine xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ProgramDirectory>C:\Program Files (x86)\Foxit Software\Foxit Reader</ProgramDirectory>
  <ProgramFilename>FoxitReader.exe</ProgramFilename>
  <TimeWait>500</TimeWait>
</PrintEngine>

для класса

[Serializable]
public class PrintEngine
    {        

        public string ProgramDirectory
        {
            get { return program_directory; }
            set { program_directory = value; }
        }

        public string ProgramFilename
        {
            get { return program_filename; }
            set { program_filename = value; }
        }

        public int TimeWait
        {
            get { return time_wait; }
            set { time_wait = value; }
        }
        

    }


Message 943

Date: 09.02.2017 7:39:11

А, не увидел что вы создаете сериализатор для списка а скармливаете ему одиночный элемент. 

В конструкторе XmlSerializer надо передавать тот тип, который десериализуется. Чтобы работать со списком, его надо заверенуть в класс и работать уже с этим классом.



Message 941

Date: 09.02.2017 9:22:26

вот это неправильно:

XmlSerializer serializer = new XmlSerializer(typeof(List<Employee>));
Employee DE = (Employee)serializer.Deserialize(reader);
надо
XmlSerializer serializer = new XmlSerializer(typeof(Employee));
Employee DE = (Employee)serializer.Deserialize(reader);

Message 940

Date: 09.02.2017 10:48:04

Во-первых, компилятор не ругался потому что контроль типа сериализатор делает на этапе выполнения

Во-вторых, разница в том, что List<Employee> это список (точнее, динамический массив) объектов, а Emploee - одиночный объект, т.е. типы разные. Сериализатор обрабатывает только тот тип, который указать при его создании.

В-третьих, для вашей исходной задачи десериализация, в общем-то, не нужна. Вы можете ее решить также оперируя классом XElement.


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub