Udostępnij za pośrednictwem


Niepubliczne konstruktory bez parametrów nie są używane do deserializacji

W celu zapewnienia spójności we wszystkich obsługiwanych obiektach docelowych monikers (TFMs), konstruktory bez parametrów nie są już używane do deserializacji z JsonSerializerprogramem , domyślnie.

Opis zmiany

Autonomiczne pakiety NuGet System.Text.Json, które obsługują program .NET Standard 2.0 i nowsze, czyli wersje 4.6.0-4.7.2, zachowują się spójnie z wbudowanym zachowaniem na platformie .NET Core 3.0 i 3.1. Na platformie .NET Core 3.x konstruktory wewnętrzne i prywatne mogą służyć do deserializacji. W pakietach autonomicznych konstruktory niepubliczne są niedozwolone, a MissingMethodException obiekt jest zgłaszany, jeśli nie zdefiniowano publicznego konstruktora bez parametrów.

Począwszy od pakietów NuGet .NET 5 i System.Text.Json NuGet 5.0.0, zachowanie jest spójne między pakietem NuGet a wbudowanymi interfejsami API. Konstruktory inne niż publiczne, w tym konstruktory bez parametrów, są domyślnie ignorowane przez serializator. Serializator używa jednego z następujących konstruktorów do deserializacji:

  • Publiczny konstruktor z adnotacjami za pomocą polecenia JsonConstructorAttribute.
  • Publiczny konstruktor bez parametrów.
  • Publiczny konstruktor sparametryzowany (jeśli jest jedynym publicznym konstruktorem).

Jeśli żaden z tych konstruktorów nie jest dostępny, NotSupportedException zwracany jest błąd podczas próby deserializacji typu.

Wprowadzona wersja

5,0

Przyczyna wprowadzenia zmiany

  • Aby wymusić spójne zachowanie między wszystkimi elementami monikers platformy docelowej (TFMs), które System.Text.Json są kompilowanie dla programu (.NET Core 3.0 i nowszych wersji oraz platformy .NET Standard 2.0)
  • Ponieważ JsonSerializer nie należy wywoływać obszaru powierzchni innego niż publiczny typu, niezależnie od tego, czy jest to konstruktor, właściwość, czy pole.
  • Jeśli jesteś właścicielem typu i jest to możliwe, ustaw konstruktor bez parametrów jako publiczny.
  • W przeciwnym razie zaimplementuj JsonConverter<T> element dla typu i steruj zachowaniem deserializacji. Można wywołać konstruktora innego niż publiczny z JsonConverter<T> implementacji, jeśli zezwalają na to reguły ułatwień dostępu języka C#.

Dotyczy interfejsów API