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


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

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

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

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

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

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

Отражение

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

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

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

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

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

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

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

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

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

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

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

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

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

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