Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описываются различия между отражением и исходным поколением, так как они связаны с 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 настройки контракта.