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

ЖАНРЫ

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

using System.Text.Json.Serialization;

using System.Xml;

using System.Xml.Serialization;

namespace SimpleSerialize

{

public class JamesBondCar : Car

{

public bool CanFly;

public bool CanSubmerge;

public override string ToString

=> $"CanFly:{CanFly}, CanSubmerge:{CanSubmerge} {base.ToString}";

}

}

Ниже

показан код финального файла класса
Person.cs
:

using System;

using System.Text.Json.Serialization;

using System.Xml;

using System.Xml.Serialization;

namespace SimpleSerialize

{

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).

По умолчанию класс

XmlSerializer
сериализирует все открытые поля/свойства как элементы XML, а не как атрибуты XML. Чтобы управлять генерацией результирующего документа XML с помощью класса
XmlSerializer
, необходимо декорировать типы любым количеством дополнительных атрибутов .NET Core из пространства имен
System.Xml.Serialization
. В табл. 20.12 описаны некоторые (но не все) атрибуты .NET Core, влияющие на способ кодирования данных XML в потоке.

< image l:href="#"/>

Разумеется, для управления тем, как

XmlSerializer
генерирует результирующий XML-документ, можно использовать многие другие атрибуты .NET Core. Полные сведения ищите в описании пространства имен
System.Xml.Serialization
в документации по .NET Core.

На заметку! Класс

XmlSerializer
требует, чтобы все сериализируемые типы в графе объектов поддерживали стандартный конструктор (поэтому обязательно добавьте его обратно, если вы определяете специальные конструкторы).

Сериализация объектов с использованием XmlSerializer

Добавьте в свой файл

Program.cs
следующую локальную функцию:

static void SaveAsXmlFormat<T>(T objGraph, string fileName)

{

// В конструкторе XmlSerializer должен быть объявлен тип.

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!");

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