Отражение и создание источника в System.Text.Json

В этой статье описываются различия между отражением и исходным поколением, так как они связаны с System.Text.Json сериализацией. Он также содержит рекомендации по выбору оптимального подхода к вашему сценарию.

Коллекция метаданных

Для сериализации или десериализации типа требуется информация о том, JsonSerializer как получить доступ к членам типа. JsonSerializer требуется следующая информация:

  • Как получить доступ к свойствам getters и полям для сериализации.
  • Как получить доступ к конструктору, наборам свойств и полям десериализации.
  • Сведения о том, какие атрибуты использовались для настройки сериализации или десериализации.
  • Конфигурация во время выполнения из JsonSerializerOptions.

Эта информация называется метаданными.

Отражение

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

Создание источника

В качестве альтернативы можно использовать функцию создания источника C#, System.Text.Json чтобы повысить производительность, уменьшить использование частной памяти и упростить обрезку сборок, что сокращает размер приложения. Кроме того, некоторые API отражения нельзя использовать в собственных приложениях AOT, поэтому для этих приложений необходимо использовать исходное поколение.

Создание источника можно использовать в двух режимах:

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

    Во время компиляции собирает сведения, System.Text.Json необходимые для сериализации, и создает файлы исходного кода, заполняющие метаданные контракта JSON для запрошенных типов.

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

    JsonSerializer функции, которые настраивают выходные данные сериализации, такие как политики именования и сохранение ссылок, несут затраты на производительность. В режиме оптимизации сериализации создается оптимизированный код сериализации, System.Text.Json который используется Utf8JsonWriter напрямую. Этот оптимизированный или быстрый код пути увеличивает пропускную способность сериализации.

    Десериализация быстрого пути в настоящее время недоступна. Дополнительные сведения см. в статье dotnet/runtime issue 55043.

Для создания System.Text.Json источника требуется C# 9.0 или более поздняя версия.

Сравнение возможностей

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

Преимущества Отражение Создание источника
(режим на основе метаданных)
Создание источника
(режим оптимизации сериализации)
Проще кодировать. ✔️
Проще отладить. ✔️ ✔️
Поддерживает недоступные члены. ✔️ ✔️* ✔️*
Поддерживает все доступные настройки сериализации. ✔️
Сокращает время запуска. ✔️ ✔️
Уменьшает использование частной памяти. ✔️ ✔️
Устраняет отражение во время выполнения. ✔️ ✔️
Упрощает сокращение размера приложения, безопасного для обрезки. ✔️ ✔️
Увеличивает пропускную способность сериализации. ✔️

* Генератор источников поддерживает некоторые недоступные члены, например внутренние типы в одной сборке. † созданные источником контракты можно изменить с помощью API настройки контракта.

Преимущества Отражение Создание источника
(режим на основе метаданных)
Создание источника
(режим оптимизации сериализации)
Проще кодировать. ✔️
Проще отладить. ✔️
Поддерживает недоступные методы доступа. ✔️
Поддерживает обязательные свойства. ✔️
Поддерживает свойства только для инициализации. ✔️
Сокращает время запуска. ✔️ ✔️
Уменьшает использование частной памяти. ✔️ ✔️
Устраняет отражение во время выполнения. ✔️ ✔️
Упрощает сокращение размера приложения, безопасного для обрезки. ✔️ ✔️
Увеличивает пропускную способность сериализации. ✔️