Шрифт:
Интервал:
Закладка:
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.
![](https://cdn.coollib.info/s20/4/0/2/8/3/0/img/_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 по умолчанию записывает только открытые свойства, но не открытые поля. Проблема решается в следующем разделе.
(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<double> StationPresets;
<b> [JsonInclude]</b>
public string RadioId = "XF-552RR6";
...
}
// Car.cs
public class Car
{
<b> [JsonInclude]</b>
public Radio TheRadio = new Radio();
- Понимание SQL - Мартин Грубер - Базы данных