Поделиться через


Режимы создания источников в System.Text.Json

Создание источника можно использовать в двух режимах: на основе метаданных и оптимизации сериализации. В этой статье описаны различные режимы.

Сведения об использовании режимов создания источника см. в разделе "Как использовать создание источника в System.Text.Json".

Режим на основе метаданных

Создание источника можно использовать для перемещения процесса сбора метаданных с момента выполнения, чтобы скомпилировать время. Во время компиляции собираются метаданные и создаются файлы исходного кода. Созданные файлы исходного кода автоматически компилируются как неотъемлемая часть приложения. Этот метод устраняет коллекцию метаданных во время выполнения, что повышает производительность сериализации и десериализации.

Улучшения производительности, предоставляемые источником, могут быть существенными. Например, результаты теста показали до 40 % или больше времени запуска, сокращение частной памяти, увеличение скорости пропускной способности (в режиме оптимизации сериализации) и уменьшение размера приложения.

Известные проблемы

По умолчанию поддерживаются только public свойства и поля в любом режиме сериализации. Однако режим отражения поддерживает использование private элементов и private методов доступа, а режим создания источника не поддерживается. Например, если атрибут JsonInclude применяется к private свойству или свойству с набором или методом private получения, он будет сериализован в режиме отражения. Режим создания источника поддерживает только public internal элементы и public internal методы public доступа свойств. Если вы устанавливаете [JsonInclude] элементы private или методы доступа и выбираете режим создания источника, NotSupportedException во время выполнения создается исключение.

Сведения о других известных проблемах с созданием источника см . в статье о проблемах GitHub, помеченных как source-generator, в репозитории dotnet/runtime .

Режим оптимизации сериализации (быстрый путь)

JsonSerializer имеет множество функций, которые настраивают выходные данные сериализации, такие как политики именования и сохранение ссылок. Поддержка всех этих функций приводит к некоторым затратам на производительность. Создание источника может повысить производительность сериализации, создав оптимизированный код, который используется Utf8JsonWriter напрямую.

Оптимизированный код не поддерживает все поддерживаемые функции JsonSerializer сериализации. Сериализатор определяет, можно ли использовать оптимизированный код и вернуться к коду сериализации по умолчанию, если указаны неподдерживаемые параметры. Например, JsonNumberHandling.AllowReadingFromString не применимо к написанию, поэтому указание этого параметра не приводит к резервному копированию кода по умолчанию.

В следующей таблице показано, какие параметры JsonSerializerOptions поддерживаются сериализацией быстрого пути:

Параметр сериализации Поддерживается для быстрого пути
AllowTrailingCommas ✔️
Converters
DefaultBufferSize ✔️
DefaultIgnoreCondition ✔️
DictionaryKeyPolicy
Encoder
IgnoreNullValues
IgnoreReadOnlyFields ✔️
IgnoreReadOnlyProperties ✔️
IncludeFields ✔️
MaxDepth ✔️
NumberHandling
PropertyNamingPolicy ✔️
ReferenceHandler
TypeInfoResolver ✔️
WriteIndented ✔️

(Следующие параметры не поддерживаются, так как они применяются только к десериализации: PropertyNameCaseInsensitive, ReadCommentHandlingи UnknownTypeHandling.)

В следующей таблице показано, какие атрибуты поддерживаются сериализацией быстрого пути:

Атрибут Поддерживается для быстрого пути
JsonConstructorAttribute
JsonConverterAttribute
JsonDerivedTypeAttribute ✔️
JsonExtensionDataAttribute
JsonIgnoreAttribute ✔️
JsonIncludeAttribute ✔️
JsonNumberHandlingAttribute
JsonPolymorphicAttribute ✔️
JsonPropertyNameAttribute ✔️
JsonPropertyOrderAttribute ✔️
JsonRequiredAttribute ✔️

Если параметр или атрибут не поддерживается для типа, сериализатор возвращается в режим метаданных, при условии, что генератор источника настроен для создания метаданных. В этом случае оптимизированный код не используется при сериализации этого типа, но может использоваться для других типов. Поэтому важно выполнить тестирование производительности с помощью параметров и рабочих нагрузок, чтобы определить, сколько преимуществ можно получить от режима оптимизации сериализации. Кроме того, для возврата к коду JsonSerializer требуется режим сбора метаданных. Если выбран только режим оптимизации сериализации, сериализация может завершиться ошибкой для типов или параметров, которые должны вернуться к коду JsonSerializer .

См. также