XML сериализация и десериализация произвольных объектов в C#

Работу с XML в C# условно можно разделить на четыре части, в зависимости от решаемых задач.

  • Стандартный разбор (парсинг) и формирование XML при помощи DOM, Xpath и т. п.;
  • Сериализация и десериализация объектов, имеющих для этого штатные средства (например, DataTable);
  • Сериализация и десериализация произвольных объектов, не относящихся к предыдущей части;
  • Валидация структуры XML документов.

В этой статье речь пойдет именно о третьей части.

Создадим простой класс, который будет содержать единственное свойство в виде строки. Так как этот класс мы впоследствии будем сериализовать в XML, то сразу же отметим его атрибутом Serializable и сделаем его открытым (public).

Здесь невольно напрашивается сравнение с подготовкой класса к сериализации (десериализации) в JSON.

Если там требовалось помечать классы и поля соответствующими атрибутами, продумывать структуру будущего JSON объекта, здесь достаточно пометить класс единственным атрибутом и средства XML сериализации .NET Framework самостоятельно определят правильную структуру XML.

Для сериализации на необходимо создать объект XmlSerializer (пространство имён System.Xml.Serialization), передав в его конструктор тип сериализуемого объекта (в нашем случае ProgData).

После этого остаётся только создать поток данных, в который будут помещены выходные и передать его вместе с сериализуемым объектом в метод Serialize объекта XmlSerializer.

Ниже показан пример сериализации экземпляра описанного ранее класса ProgData в XML файл через соответствующий поток.

Содержимое созданного XML файла:

Как мы видим, оно полностью соответствует структуре исходного объекта.

Теперь мы попытаемся этот объект восстановить.

Для этого, прочитав данные из XML файла в поток, передадим его в метод Deserialize объекта XmlSerialize, как это показано ниже.

Единственна неприятная особенность — метод Deserialize возвращает тип object. Поэтому приведение типов обязательно.

С простыми объектами всё достаточно очевидно, но как поступить в более сложных случаях?

Например, этот класс, помимо всего прочего, содержит целый массив объектов также произвольного класса Animal:

На самом деле никаких отличий для сложных объектов нет. Они сериализуются в XML и десериализуются из него аналогичным образом.

Единственная оговорка — классы, объекты которых входят в состав сериализуемого класса также должны быть открытыми и помеченными атрибутом Serializable.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *