Режимы создания источников в 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
.