Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Создание источника можно использовать в двух режимах: на основе метаданных и оптимизации сериализации. В этой статье описаны различные режимы.
Сведения об использовании режимов создания источника см. в разделе "Как использовать создание источника в 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.