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.
Para mantener la coherencia entre todos los monikers de la plataforma de destino (TFM) admitidos, de forma predeterminada ya no se usan para la deserialización con JsonSerializer los constructores no públicos y sin parámetros.
Descripción del cambio
Los paquetes NuGet System.Text.Json independientes que admiten .NET Standard 2.0 y versiones posteriores, es decir, las versiones 4.6.0-4.7.2, se comportan incoherentemente con el comportamiento integrado en .NET Core 3.0 y 3.1. En .NET Core 3.x, se pueden usar constructores internos y privados para la deserialización. En los paquetes independientes, no se permiten constructores no públicos y se produce una MissingMethodException excepción si no se define ningún constructor público sin parámetros.
A partir de .NET 5 y System.Text.Json Paquete NuGet 5.0.0, el comportamiento es coherente entre el paquete NuGet y las API integradas. Los constructores no públicos, incluidos los constructores sin parámetros, se omiten mediante el serializador de forma predeterminada. El serializador usa uno de los constructores siguientes para la deserialización:
- Constructor público anotado con JsonConstructorAttribute.
- Constructor público sin parámetros.
- Constructor parametrizado público (si es el único constructor público presente).
Si ninguno de estos constructores está disponible, se inicia una excepción NotSupportedException si intenta deserializar el tipo.
Versión introducida
5.0
Motivo del cambio
- Aplicar un comportamiento coherente entre todos los monikers de la plataforma de destino (TFM) para los que se compila System.Text.Json (.NET Core 3.0 y versiones posteriores, y .NET Standard 2.0)
- JsonSerializer no debe llamar al área expuesta no pública de un tipo, ya sea un constructor, una propiedad o un campo.
Acción recomendada
- Si usted es el propietario del tipo y es posible, haga que el constructor sin parámetros sea público.
- De lo contrario, implemente un JsonConverter<T> para el tipo y controle el comportamiento de deserialización. Puede llamar a un constructor no público desde una JsonConverter<T> implementación si las reglas de accesibilidad de C# para ese escenario lo permiten.