Язык программирования 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.cs, добавив следующий стартовый код:
using 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 предоставляет класс System.Xml.Serialization.XmlSerializer. Этот форматер можно применять для сохранения открытого состояния заданного объекта в виде чистой XML-разметки. Важно отметить, что XmlSerializer требует объявления типа, который будет сериализироваться (или десериализироваться).
Управление генерацией данных XML
Если у вас есть опыт работы с технологиями XML, то вы знаете, что часто важно гарантировать соответствие данных внутри документа XML набору правил, которые устанавливают действительность данных. Понятие действительного документа XML не имеет никакого отношения к синтаксической правильности элементов XML (вроде того, что все открывающие элементы должны иметь закрывающие элементы). Действительные документы отвечают согласованным правилам форматирования (например, поле X должно быть выражено в виде атрибута, но не подэлемента), которые обычно задаются посредством схемы XML или файла определения типа документа (Document-Type Definition — DTD).
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})По умолчанию класс XmlSerializer сериализирует все открытые поля/свойства как элементы XML, а не как атрибуты XML. Чтобы управлять генерацией результирующего документа XML с помощью класса XmlSerializer, необходимо декорировать типы любым количеством дополнительных атрибутов .NET Core из пространства имен System.Xml.Serialization. В табл. 20.12 описаны некоторые (но не все) атрибуты .NET Core, влияющие на способ кодирования данных XML в потоке.
Разумеется, для управления тем, как XmlSerializer генерирует результирующий XML-документ, можно использовать многие другие атрибуты .NET Core. Полные сведения ищите в описании пространства имен System.Xml.Serialization в документации по .NET Core.
На заметку! Класс XmlSerializer требует, чтобы все сериализируемые типы в графе объектов поддерживали стандартный конструктор (поэтому обязательно добавьте его обратно, если вы определяете специальные конструкторы).
Сериализация объектов с использованием XmlSerializer
Добавьте в свой файл Program.cs следующую локальную функцию:
static 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!");
Заглянув внутрь сгенерированного файла CarData.xml, вы обнаружите в нем показанные ниже XML-данные: