Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
En determinados contextos, como el polimorfismo y la conservación de referencias, System.Text.Json reserva nombres de propiedad específicos (por ejemplo, $type, $idy $ref) para emitir metadatos. Algunos nombres de propiedad, como , TypeDiscriminatorPropertyName también se pueden configurar con nombres personalizados. Anteriormente, el serializador no realizó la validación de si estos nombres de propiedad entraron en conflicto con contratos definidos por el usuario, lo que podría dar lugar a propiedades duplicadas y generar JSON ambiguos o no pudieron realizar un recorrido de ida y vuelta. A partir de .NET 10, System.Text.Json permite la validación para evitar estas configuraciones y proporciona una advertencia temprana a los usuarios.
Versión introducida
.NET 10
Comportamiento anterior
Anteriormente, el código siguiente generaba un objeto JSON no válido con propiedades duplicadas Type y no se pudo deserializar con :JsonException
using System.Text.Json;
using System.Text.Json.Serialization;
string json = JsonSerializer.Serialize<Animal>(new Dog());
Console.WriteLine(json); // {"Type":"dog","Type":"Dog"}
JsonSerializer.Deserialize<Animal>(json); // JsonException: Deserialized object contains a duplicate 'Type' metadata property.
[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type")]
[JsonDerivedType(typeof(Dog), "dog")]
public abstract class Animal
{
public abstract string Type { get; }
}
public class Dog : Animal
{
public override string Type => "Dog";
}
Nuevo comportamiento
A partir de .NET 10, cualquier intento de serializar ese mismo tipo produce un error de validación temprana:
InvalidOperationException: El tipo "Dog" contiene la propiedad "Type" que entra en conflicto con un nombre de propiedad de metadatos existente. Considere cambiar el nombre o ignorarlo con JsonIgnoreAttribute.
Este error de validación se produce cuando se crea por primera vez el serializador o cuando se intenta la serialización por primera vez, lo que proporciona la detección temprana de contratos de serialización no válidos.
Tipo de cambio disruptivo
Este es un cambio de comportamiento.
Motivo del cambio
Este cambio proporciona prevención temprana de contratos de serialización no válidos. Al validar los nombres de propiedad por adelantado, el serializador evita escenarios en los que se emitirían propiedades duplicadas, lo que da lugar a un JSON no válido que no puede realizar un recorrido de ida y vuelta correctamente. Esto ayuda a los desarrolladores a identificar y corregir problemas de configuración durante el desarrollo en lugar de detectarlos en tiempo de ejecución durante la deserialización.
Para obtener más información, consulte:
- [STJ] No permitir nombres de propiedad que entren en conflicto con los nombres de propiedad de metadatos (dotnet/runtime#106390)
- No permitir tipos con nombres de propiedad en conflicto con metadatos (dotnet/runtime#106460)
Acción recomendada
Evite usar nombres de propiedad que entren en conflicto con las propiedades de metadatos específicas de System.Text.Json (como $type, $idy $ref). Si es absolutamente necesario mantener dicha propiedad en la clase, aplique una anotación JsonIgnoreAttribute en la propiedad en conflicto.