El deserializador basado en la reflexión resuelve los metadatos diligentemente
Anteriormente, el serializador basado en la reflexión System.Text.Json usaba un enfoque de carga diferida para resolver los metadatos de propiedad. Ese enfoque hizo posible que los POCO que contenían tipos de propiedad no admitidos se deserializaran correctamente, siempre que el JSON subyacente no se enlazara a ninguna de las propiedades no admitidas. (Esto fue a pesar de que las instancias del mismo tipo no se serializaban).
A partir de .NET 8, el serializador se ha cambiado para que todas las propiedades se resuelvan diligentemente en la serialización y deserialización. Este cambio se realizó para agregar una mejor compatibilidad con la combinación de varios solucionadores, lo que requiere un análisis anticipado del gráfico de tipos serializados. Un efecto secundario de este cambio es que si dependía del comportamiento anterior, podría empezar a ver nuevos errores de deserialización en tiempo de ejecución.
Comportamiento anterior
El código de deserialización siguiente tuvo éxito en .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>();
}
Comportamiento nuevo
A partir de .NET 8, el mismo código de la sección Comportamiento anterior produce una InvalidOperationException en tiempo de ejecución.
System.InvalidOperationException: el tipo "System.ReadOnlySpan`1[System.Byte]" de la propiedad "Span" en el tipo "NestedValue" no es válido para la serialización o deserialización porque es un tipo de puntero, es una ref struct o contiene parámetros genéricos que no se han reemplazado por tipos específicos.
Este error es coherente con el error que se produjo incluso en versiones anteriores si intentó serializar una instancia del mismo tipo. También es coherente con el generador de origen, que genera un error en tiempo de compilación.
Versión introducida
.NET 8 Versión preliminar 4
Tipo de cambio importante
Este es un cambio de comportamiento.
Motivo del cambio
Los nuevos requisitos relacionados con la compatibilidad con la serialización de rutas rápidas en contextos generados por orígenes combinados han hecho necesario este cambio (consulte dotnet/runtime#71933).
Acción recomendada
Si este cambio le resulta problemático, puede:
Quitar la propiedad no admitida del tipo.
Crear un convertidor personalizado para el tipo no admitido.
Agregar el atributo JsonIgnoreAttribute:
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }