Язык программирования C#9 и платформа .NET5
{public class Person{// Открытое поле.public bool IsAlive = true;/// Закрытое поле.private int PersonAge = 21;// Открытое свойство/закрытые данные.private string _fName = string.Empty;public string FirstName{get { return _fName; }set { _fName = value; }}public override string ToString() =>$"IsAlive:{IsAlive} FirstName:{FirstName} Age:{PersonAge} ";}}В заключение модифицируйте содержимое файла
, добавив следующий стартовый код:Program.csusing System;using System.Collections.Generic;using System.IO;using System.Text.Json;using System.Text.Json.Serialization;using System.Xml;using System.Xml.Serialization;using SimpleSerialize;Console.WriteLine("***** Fun with Object Serialization *****\n");// Создать объект JamesBondCar и установить состояние.JamesBondCar jbc = new(){CanFly = true,CanSubmerge = false,TheRadio = new(){StationPresets = new() {89.3, 105.1, 97.1},HasTweeters = true}};Person p = new(){FirstName = "James",IsAlive = true};Итак, все готово для того, чтобы приступить к исследованию сериализации XML и JSON.
Сериализация и десериализация с помощью XmlSerializer
Пространство имен
предоставляет классSystem.Xml. Этот форматер можно применять для сохранения открытого состояния заданного объекта в виде чистой XML-разметки. Важно отметить, чтоSystem.Xml.Serialization.XmlSerializerтребует объявления типа, который будет сериализироваться (или десериализироваться).XmlSerializerУправление генерацией данных XML
Если у вас есть опыт работы с технологиями XML, то вы знаете, что часто важно гарантировать соответствие данных внутри документа XML набору правил, которые устанавливают действительность данных. Понятие действительного документа XML не имеет никакого отношения к синтаксической правильности элементов XML (вроде того, что все открывающие элементы должны иметь закрывающие элементы). Действительные документы отвечают согласованным правилам форматирования (например, поле
должно быть выражено в виде атрибута, но не подэлемента), которые обычно задаются посредством схемы XML или файла определения типа документа (Document-Type Definition — DTD).XПо умолчанию класс
сериализирует все открытые поля/свойства как элементы XML, а не как атрибуты XML. Чтобы управлять генерацией результирующего документа XML с помощью классаXmlSerializer, необходимо декорировать типы любым количеством дополнительных атрибутов .NET Core из пространства именXmlSerializer. В табл. 20.12 описаны некоторые (но не все) атрибуты .NET Core, влияющие на способ кодирования данных XML в потоке.System.Xml.SerializationРазумеется, для управления тем, как
генерирует результирующий XML-документ, можно использовать многие другие атрибуты .NET Core. Полные сведения ищите в описании пространства именXmlSerializerв документации по .NET Core.System.Xml.SerializationНа заметку! Класс
требует, чтобы все сериализируемые типы в графе объектов поддерживали стандартный конструктор (поэтому обязательно добавьте его обратно, если вы определяете специальные конструкторы).XmlSerializerСериализация объектов с использованием XmlSerializer
Добавьте в свой файл
следующую локальную функцию:Program.csstatic void SaveAsXmlFormat<T>(T objGraph, string fileName){<b> // В конструкторе XmlSerializer должен быть объявлен тип.</b>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!");Заглянув внутрь сгенерированного файла
, вы обнаружите в нем показанные ниже XML-данные:CarData.xml
