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.
Zalecana akcja
- 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#.