Язык программирования C#9 и платформа .NET5
<?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в виде атрибутов XML, тогда модифицируйте определение классаcanSubmergeследующим образом: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-instancexmlns:xsd="http://www.w3.org/2001/XMLSchema"><IsAlive>true</IsAlive><FirstName>James</FirstName></Person>Важно отметить, что свойство
не сериализируется в XML. Это подтверждает, что сериализация XML учитывает только открытые свойства и поля.PersonAgeСериализация коллекций объектов
Теперь, когда вы видели, каким образом сохранять одиночный объект в потоке, давайте посмотрим,как сохранить набор объектов. Создайте локальную функцию, которая инициализирует список объектов
и сериализирует его в XML:JamesBondCarstatic 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-разметки обратно в граф объектов. И снова обратите внимание, что тип, с которым нужно работать, должен быть передан конструктору
:XmlSerializerstatic T ReadAsXmlFormat<T>(string fileName){// Создать типизированный экземпляр класса XmlSerializer.XmlSerializer xmlFormat = new XmlSerializer(typeof(T));