<?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
{
<b> [XmlAttribute]</b>
public bool CanFly;
<b> [XmlAttribute]</b>
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"
<b> CanFly="true" CanSubmerge="false" xmlns="http://www.MyCompany.com"></b>
...
</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));