Язык программирования 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, который вы можете использовать для сохранения открытого состояния заданного объекта как данных JSON.System.Text.Json.JsonSerializerУправление генерацией данных JSON
По умолчанию
сериализирует все открытые свойства в виде пар "имя-значение" в формате JSON, применяя такие же имена (и регистр символов), как у имен свойств объекта. Вы можете управлять многими аспектами процесса сериализации с помощью наиболее часто используемых атрибутов, перечисленных в табл. 20.13.JsonSerializerСериализация объектов с использованием JsonSerializer
Класс
содержит статические методыJsonSerializer, применяемые для преобразования объектов .NET Core (включая графы объектов) в строковое представление открытых свойств. Данные представляются как пары "имя-значение" в формате JSON. Добавьте в файлSerialize()показанную ниже локальную функцию:Program.csstatic 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 можно двумя способами. Первый способ предусматривает использование класса
для сообщенияJsonSerializerOptionsr о необходимости включить все поля. Второй способ предполагает модификацию классов за счет добавления атрибутаJsonSerializeк каждому открытому полю, которое должно быть включено в вывод JSON. Обратите внимание, что при первом способе (применение[Jsonlnclude]) будут включаться все открытые поля в графе объектов. Чтобы исключить отдельные открытые поля с использованием такого приема, вам придется использовать для этих полей атрибут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.cspublic 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.cspublic class Car{<b> [JsonInclude]</b>public Radio TheRadio = new Radio();
