Sdílet prostřednictvím


Neveřejné konstruktory bez parametrů se k deserializaci nepoužívají

Pro konzistenci napříč všemi podporovanými cílovými cílovou architekturou (TFMs) se ve výchozím nastavení nepoužívají konstruktory bez parametrů pro deserializaci JsonSerializer.

Změna popisu

Samostatné balíčky NuGet System.Text.Json, které podporují .NET Standard 2.0 a vyšší, tedy verze 4.6.0-4.7.2, se chovají nekonzistentně s integrovaným chováním v .NET Core 3.0 a 3.1. V .NET Core 3.x lze k deserializaci použít interní a privátní konstruktory. V samostatných balíčcích nejsou povoleny neveřejné konstruktory a MissingMethodException je vyvolána, pokud není definován žádný veřejný konstruktor bez parametrů.

Počínaje balíčkem NuGet .NET 5 a System.Text.Json 5.0.0 je chování konzistentní mezi balíčkem NuGet a integrovanými rozhraními API. Neveřejné konstruktory, včetně konstruktorů bez parametrů, jsou ve výchozím nastavení serializátorem ignorovány. Serializátor používá jeden z následujících konstruktorů pro deserializaci:

  • Veřejný konstruktor opatřený poznámkami JsonConstructorAttribute.
  • Veřejný konstruktor bez parametrů
  • Veřejný parametrizovaný konstruktor (pokud se jedná o jediný veřejný konstruktor, který existuje).

Pokud není k dispozici žádný z těchto konstruktorů, NotSupportedException vyvolá se při pokusu o deserializaci typu.

Zavedená verze

5,0

Důvod změny

  • Vynucení konzistentního chování mezi všemi cílovými moduly monikery (TFM), které System.Text.Json se sestavují pro (.NET Core 3.0 a novější verze a .NET Standard 2.0)
  • Protože JsonSerializer by nemělo volat neveřejnou plochu typu, ať už jde o konstruktor, vlastnost nebo pole.
  • Pokud typ vlastníte a je to možné, zpřístupňte konstruktor bez parametrů.
  • V opačném případě implementujte JsonConverter<T> pro typ a řídit chování deserializace. Pokud to pravidla přístupnosti jazyka C# pro tento scénář umožňují, můžete z JsonConverter<T> implementace volat neveřejný konstruktor.

Ovlivněná rozhraní API