Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Anteriormente, el serializador basado en reflexión de System.Text.Json utilizaba una estrategia de carga diferida para resolver los metadatos de las propiedades. Ese enfoque hizo posible que los POCOs 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 del hecho de que las instancias del mismo tipo no se serializarían).
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 se realizó correctamente 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>();
}
Nuevo comportamiento
A partir de .NET 8, el mismo código de la sección Comportamiento anterior produce una InvalidOperationException excepción 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 estructura ref o contiene parámetros genéricos que no se han reemplazado por tipos específicos.
Este error es el mismo que se produjo incluso en versiones anteriores al intentar serializar una instancia del mismo tipo. También es coherente con el generador de código fuente, que genera un error en el tiempo de compilación.
Versión introducida
.NET 8 Versión preliminar 4
Tipo de cambio disruptivo
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 es problemático para usted, puede:
Quitar la propiedad no admitida del tipo.
Cree un convertidor personalizado para el tipo no admitido.
Agregue el JsonIgnoreAttribute atributo :
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }