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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 371 372 373 374 375 376 377 378 379 ... 642

  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.

Сериализация объектов с использованием 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 по умолчанию записывает только открытые свойства, но не открытые поля. Проблема решается в следующем разделе.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

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

Включить открытые поля в генерируемые данные JSON можно двумя способами. Первый способ предусматривает использование класса JsonSerializerOptions для сообщения JsonSerializer о необходимости включить все поля. Второй способ предполагает модификацию классов за счет добавления атрибута [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();

1 ... 371 372 373 374 375 376 377 378 379 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий