Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Создание источника можно использовать в двух режимах: на основе метаданных и оптимизации сериализации. В этой статье описаны различные режимы.
Сведения об использовании режимов создания источника см. в разделе "Как использовать создание источника в System.Text.Json".
Режим на основе метаданных
Создание источника можно использовать для перемещения процесса сбора метаданных с момента выполнения, чтобы скомпилировать время. Во время компиляции собираются метаданные и создаются файлы исходного кода. Созданные файлы исходного кода автоматически компилируются как неотъемлемая часть приложения. Этот метод устраняет коллекцию метаданных во время выполнения, что повышает производительность сериализации и десериализации.
Улучшения производительности, предоставляемые источником, могут быть существенными. Например, результаты теста показали до 40 % или больше времени запуска, сокращение частной памяти, увеличение скорости пропускной способности (в режиме оптимизации сериализации) и уменьшение размера приложения.
Известные проблемы
Только public
свойства и поля поддерживаются по умолчанию в режиме сериализации (отражение или генерация исходного кода). Однако режим отражения поддерживает использование private
членов, в то время как режим генерации источника этого не делает. Например, если атрибут JsonInclude применяется режиме отражения. Режим создания источника поддерживает только 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
.