Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сериализатор на основе отражения System.Text.Json ранее использовал подход ленивой загрузки для обработки метаданных свойств. Этот подход позволил POCOs, содержащим неподдерживаемые типы свойств, успешно десериализироваться, если базовый JSON не связывается ни с одним из неподдерживаемых свойств. Это было несмотря на то, что экземпляры одного типа не могут быть сериализованы.
Начиная с .NET 8, сериализатор изменился так, что все свойства обрабатывались как при сериализации, так и при десериализации. Это изменение было внесено для повышения поддержки объединения нескольких сопоставителей, что требует раннего анализа графа сериализованного типа. Побочным эффектом этого изменения является то, что если вы зависели от предыдущего поведения, вы можете начать видеть новые ошибки десериализации среды выполнения.
Предыдущее поведение
Следующий код десериализации успешно выполнен в .NET 7.
var result = JsonSerializer.Deserialize<MyPoco>("""{ "Value": 1 }"""); //, MyContext.Default.MyPoco);
Console.WriteLine(result.Value);
public class MyPoco
{
public int Value { get; set; }
public NestedValue Unsupported { get; set; }
}
public class NestedValue
{
public ReadOnlySpan<byte> Span => Array.Empty<byte>();
}
Новое поведение
Начиная с .NET 8, тот же код из раздела "Предыдущее поведение" вызывает исключение InvalidOperationException во время выполнения.
System.InvalidOperationException: тип "System.ReadOnlySpan"1[System.Byte]" свойства "Span" типа "NestedValue" является недопустимым для сериализации или десериализации, так как он является типом указателя, является структурой ссылок или содержит универсальные параметры, которые не были заменены определенными типами.
Эта ошибка соответствует той, что возникала даже в предыдущих версиях, если вы пытались сериализовать экземпляр того же типа. Он также согласуется с генератором исходного кода, который вызывает ошибку во время компиляции.
Представленная версия
.NET 8( предварительная версия 4)
Тип разрушающего изменения
Причина изменения
Это изменение было вызвано новыми требованиями, связанными с поддержкой сериализации быстрого пути в объединенных исходных контекстах (см. dotnet/runtime#71933).
Рекомендуемое действие
Если это изменение проблематично для вас, вы можете:
Удалите неподдерживаемое свойство из вашего типа.
Создайте пользовательский преобразователь для неподдерживаемого типа.
JsonIgnoreAttribute Добавьте атрибут:
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }