Constructores no públicos sin parámetros que no se usan para la deserialización
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 de manera incoherente 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 inicia una excepción MissingMethodException si no se define ningún constructor público sin parámetros.
A partir de .NET 5 y del paquete NuGet System.Text.Json 5.0.0, el comportamiento es coherente entre el paquete NuGet y las API integradas. El serializador omite de forma predeterminada los constructores no públicos, incluidos los que no tienen parámetros. 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 público con parámetros (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 es el propietario del tipo y es factible, convierta en público el constructor sin parámetros.
- De lo contrario, implemente un elemento JsonConverter<T> para el tipo y controle el comportamiento de la deserialización. Puede llamar a un constructor no público desde una implementación de JsonConverter<T> si las reglas de accesibilidad de C# para ese escenario lo permiten.