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