KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
Перейти на страницу:

  using (Stream fStream = new FileStream(fileName, FileMode.Open))

  {

    T obj = default;

    obj = (T)xmlFormat.Deserialize(fStream);

    return obj;

  }

}

Добавьте к операторам верхнего уровня следующий код, чтобы восстановить XML-разметку обратно в объекты (или списки объектов):

JamesBondCar savedCar = ReadAsXmlFormat<JamesBondCar>("CarData.xml");

Console.WriteLine("Original Car: {0}",savedCar.ToString());

Console.WriteLine("Read Car: {0}",savedCar.ToString());

List<JamesBondCar> savedCars =

    ReadAsXmlFormat<List<JamesBondCar>>("CarCollection.xml");

Сериализация и десериализация с помощью System.Text.Json

 В пространстве имен

System.Text.Json
имеется класс
System.Text.Json.JsonSerializer
, который вы можете использовать для сохранения открытого состояния заданного объекта как данных JSON.

Управление генерацией данных JSON

 По умолчанию

JsonSerializer
сериализирует все открытые свойства в виде пар "имя-значение" в формате JSON, применяя такие же имена (и регистр символов), как у имен свойств объекта. Вы можете управлять многими аспектами процесса сериализации с помощью наиболее часто используемых атрибутов, перечисленных в табл. 20.13.

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

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

Класс

JsonSerializer
содержит статические методы
Serialize()
, применяемые для преобразования объектов .NET Core (включая графы объектов) в строковое представление открытых свойств. Данные представляются как пары "имя-значение" в формате JSON. Добавьте в файл
Program.cs
показанную ниже локальную функцию:

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

{

  File.WriteAllText(fileName,

      System.Text.Json.JsonSerializer.Serialize(objGraph));

}

Добавьте к своим операторам верхнего уровня следующий код:

SaveAsJsonFormat(jbc, "CarData.json");

Console.WriteLine("=> Saved car in JSON format!");

SaveAsJsonFormat(p, "PersonData.json");

Console.WriteLine("=> Saved person in JSON format!");

Когда вы будете исследовать файлы JSON, вас может удивить тот факт, что файл

CarData.json
пуст (не считая пары фигурных скобок), а файл
PersonData.json
содержит только значение
Firstname
. Причина в том, что
JsonSerializer
по умолчанию записывает только открытые свойства, но не открытые поля. Проблема решается в следующем разделе.

Включение полей

Включить открытые поля в генерируемые данные JSON можно двумя способами. Первый способ предусматривает использование класса

JsonSerializerOptions
для сообщения
JsonSerialize
r о необходимости включить все поля. Второй способ предполагает модификацию классов за счет добавления атрибута
[Jsonlnclude]
к каждому открытому полю, которое должно быть включено в вывод JSON. Обратите внимание, что при первом способе (применение
JsonSerializationOptions
) будут включаться все открытые поля в графе объектов. Чтобы исключить отдельные открытые поля с использованием такого приема, вам придется использовать для этих полей атрибут
JsonExclude
.

Модифицируйте метод

SaveAsJsonFormat()
, как показано ниже:

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

{

<b>  var options = new JsonSerializerOptions</b>

<b>  {</b>

<b>    IncludeFields = true,</b>

<b>  };</b>

  File.WriteAllText(fileName,

      System.Text.Json.JsonSerializer.Serialize(objGraph, options));

}

Вместо применения класса

JsonSerializerOptions
того же результата можно достичь, обновив все открытые поля в примерах классов следующим образом (имейте в виду, что вы можете оставить в классах атрибуты
Xml
и они не будут помехой
JsonSerializer
):

// Radio.cs

public class Radio

{

<b>  [JsonInclude]</b>

  public bool HasTweeters;

<b>  [JsonInclude]</b>

  public bool HasSubWoofers;

<b>  [JsonInclude]</b>

  public List&lt;double&gt; StationPresets;

<b>  [JsonInclude]</b>

  public string RadioId = &quot;XF-552RR6&quot;;

  ...

}

// Car.cs

public class Car

{

<b>  [JsonInclude]</b>

  public Radio TheRadio = new Radio();

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*