Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Para consistência em todos os TFMs (Moniker da Estrutura de Destino) com suporte, construtores não públicos e sem parâmetros não são mais usados para desserialização com JsonSerializer, por padrão.
Descrição da alteração
Os pacotes NuGet System.Text.Json autônomos que dão suporte ao .NET Standard 2.0 e superior, ou seja, as versões 4.6.0-4.7.2, se comportam de forma inconsistente com o comportamento interno no .NET Core 3.0 e 3.1. No .NET Core 3.x, construtores internos e privados podem ser usados para desserialização. Nos pacotes autônomos, construtores não públicos não são permitidos e um MissingMethodException é gerado se nenhum construtor público sem parâmetros for definido.
Começando com o .NET 5 e o pacote NuGet System.Text.Json 5.0.0, o comportamento é consistente entre o pacote NuGet e as APIs internas. Construtores não públicos, incluindo construtores sem parâmetros, são ignorados pelo serializador por padrão. O serializador usa um dos seguintes construtores para desserialização:
- Construtor público anotado com JsonConstructorAttribute.
- Construtor público sem parâmetros.
- Construtor parametrizado público (se for o único construtor público presente).
Se nenhum desses construtores estiver disponível, um NotSupportedException será gerado se você tentar desserializar o tipo.
Versão introduzida
5,0
Motivo da alteração
- Para impor um comportamento consistente entre todos os TFMs (Moniker da Estrutura de Destino) que System.Text.Json compila para (.NET Core 3.0 e versões posteriores e .NET Standard 2.0)
- Porque JsonSerializer não deve chamar a área de superfície não pública de um tipo, seja um construtor, uma propriedade ou um campo.
Ação recomendada
- Se você possui o tipo e ele é viável, torne o construtor sem parâmetros público.
- Caso contrário, implemente um JsonConverter<T> para o tipo e controle o comportamento de desserialização. Você pode chamar um construtor não público de uma JsonConverter<T> implementação se as regras de acessibilidade do C# para esse cenário permitirem.