Share via


Construtores não públicos sem parâmetros não usados para desserialização

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 das alterações

Os pacotes NuGet autônomos do System.Text.Json que dão suporte ao .NET Standard 2.0 e superiores, ou seja, as versões 4.6.0 a 4.7.2, comportam-se 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 é lançado se não for definido nenhum construtor público sem parâmetros.

A partir do pacote NuGet 5.0.0 do System.Text.Json e do .NET 5, 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 público parametrizado (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.
  • 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 implementação JsonConverter<T> se as regras de acessibilidade do C# para esse cenário permitirem.

APIs afetadas