Если у вас есть опыт работы с технологиями XML, то вы знаете, что часто важно гарантировать соответствие данных внутри документа XML набору правил, которые устанавливают
X должно быть выражено в виде атрибута, но не подэлемента), которые обычно задаются посредством схемы XML или файла определения типа документа (Document-Type Definition — DTD).По умолчанию класс XmlSerializer
XmlSerializer, необходимо декорировать типы любым количеством дополнительных атрибутов .NET Core из пространства имен System.Xml.Serialization. В табл. 20.12 описаны некоторые (но не все) атрибуты .NET Core, влияющие на способ кодирования данных XML в потоке.Разумеется, для управления тем, как XmlSerializer
System.Xml.Serialization в документации по .NET Core.На заметку!
КлассXmlSerializer требует, чтобы все сериализируемые типы в графе объектов поддерживали стандартный конструктор (поэтому обязательно добавьте его обратно, если вы определяете специальные конструкторы).Сериализация объектов с использованием XmlSerializer
Добавьте в свой файл Program.cs
static void SaveAsXmlFormat
{
// В конструкторе XmlSerializer должен быть объявлен тип.
XmlSerializer xmlFormat = new XmlSerializer(typeof(T));
using (Stream fStream = new FileStream(fileName,
FileMode.Create, FileAccess.Write, FileShare.None))
{
xmlFormat.Serialize(fStream, objGraph);
}
}
Добавьте к операторам верхнего уровня такой код:
SaveAsXmlFormat(jbc, "CarData.xml");
Console.WriteLine("=> Saved car in XML format!");
SaveAsXmlFormat(p, "PersonData.xml");
Console.WriteLine("=> Saved person in XML format!");
Заглянув внутрь сгенерированного файла CarData.xml
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema" xmlns="http://www.MyCompany.com">
Если вы хотите указать специальное пространство имен XML, которое уточняет JamesBondCar
canFly и canSubmerge в виде атрибутов XML, тогда модифицируйте определение класса JamesBondCar следующим образом:[Serializable, XmlRoot(Namespace = "http://www.MyCompany.com")]
public class JamesBondCar : Car
{
[XmlAttribute]
public bool CanFly;
[XmlAttribute]
public bool CanSubmerge;
...
}
Вот как будет выглядеть результирующий XML-документ (обратите внимание на открывающий элемент
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
CanFly="true" CanSubmerge="false" xmlns="http://www.MyCompany.com">
...
Исследуйте содержимое файла PersonData.xml
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
Важно отметить, что свойство PersonAge
Сериализация коллекций объектов
Теперь, когда вы видели, каким образом сохранять одиночный объект в потоке, давайте посмотрим,как сохранить набор объектов. Создайте локальную функцию, которая инициализирует список объектов JamesBondCar
static void SaveListOfCarsAsXml()
{
// Сохранить список List
List
{