Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Заглянув внутрь сгенерированного файла

CarData.xml
, вы обнаружите в нем показанные ниже XML-данные:

<?xml version="1.0"?>

<JamesBondCar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd=
"http://www.w3.org/2001/XMLSchema" xmlns="http://www.MyCompany.com">

<TheRadio>

<HasTweeters>true</HasTweeters>

<HasSubWoofers>false</HasSubWoofers>

<StationPresets>

<double>89.3</double>

<double>105.1</double>

<double>97.1</double>

</StationPresets>

<RadioId>XF-552RR6</RadioId>

</TheRadio>

<IsHatchBack>false</IsHatchBack>

<CanFly>true</CanFly>

<CanSubmerge>false</CanSubmerge>

</JamesBondCar>

Если

вы хотите указать специальное пространство имен 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-документ (обратите внимание на открывающий элемент

<JamesBondCar>
):

<?xml version="1.0"""?>

<JamesBondCar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

CanFly="true" CanSubmerge="false" xmlns="http://www.MyCompany.com">

...

</JamesBondCar>

Исследуйте содержимое файла

PersonData.xml
:

<?xml version="1.0"?>

<Person xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">

<IsAlive>true</IsAlive>

<FirstName>James</FirstName>

</Person>

Важно

отметить, что свойство
PersonAge
не сериализируется в XML. Это подтверждает, что сериализация XML учитывает только открытые свойства и поля.

Сериализация коллекций объектов

Теперь, когда вы видели, каким образом сохранять одиночный объект в потоке, давайте посмотрим,как сохранить набор объектов. Создайте локальную функцию, которая инициализирует список объектов

JamesBondCar
и сериализирует его в XML:

static void SaveListOfCarsAsXml

{

// Сохранить список List<T> объектов JamesBondCar.

List<JamesBondCar> myCars = new

{

new JamesBondCar{CanFly = true, CanSubmerge = true},

new JamesBondCar{CanFly = true, CanSubmerge = false},

new JamesBondCar{CanFly = false, CanSubmerge = true},

new JamesBondCar{CanFly = false, CanSubmerge = false},

};

using (Stream fStream = new FileStream("CarCollection.xml",

FileMode.Create, FileAccess.Write, FileShare.None))

{

XmlSerializer xmlFormat = new XmlSerializer(typeof(List<JamesBondCar>));

xmlFormat.Serialize(fStream, myCars);

}

Console.WriteLine("=> Saved list of cars!");

}

Наконец, добавьте следующую строку, чтобы задействовать новую функцию:

SaveListOfCarsAsXml;

Десериализация объектов и коллекций объектов

Десериализация XML буквально противоположна сериализации объектов (и коллекций объектов). Рассмотрим показанную далее локальную функцию для десериализации XML-разметки обратно в граф объектов. И снова обратите внимание, что тип, с которым нужно работать, должен быть передан конструктору

XmlSerializer
:

static T ReadAsXmlFormat<T>(string fileName)

{

// Создать типизированный экземпляр класса XmlSerializer.

XmlSerializer xmlFormat = new XmlSerializer(typeof(T));

using (Stream fStream = new FileStream(fileName, FileMode.Open))

{

T obj = default;

obj = (T)xmlFormat.Deserialize(fStream);

return obj;

}

}

Добавьте к операторам верхнего уровня следующий код, чтобы восстановить XML-разметку обратно в объекты (или списки объектов):

Поделиться с друзьями: