Udostępnij za pośrednictwem


Konstruktor kopiowania JsonSerializerOptions zawiera konstruktor JsonSerializerContext

Wraz z wydaniem generowania źródła na platformie .NET 6 JsonSerializerOptions konstruktor kopiowania został celowo wykonany, aby zignorować jego JsonSerializerContext stan. Miało to sens w tym czasie, ponieważ JsonSerializerContext zostało zaprojektowane tak, aby mieć relację 1:1 z JsonSerializerOptions wystąpieniami. W programie .NET 7 IJsonTypeInfoResolver zastępuje JsonSerializerContext uogólnianie kontekstu, co eliminuje potrzebę ścisłego sprzężenia między elementami JsonSerializerOptions i JsonSerializerContext. Konstruktor kopiowania zawiera IJsonTypeInfoResolver/JsonSerializerContext teraz informacje, które mogą manifestować się jako zmiana powodująca niezgodność w niektórych scenariuszach.

Poprzednie zachowanie

Na platformie .NET 6 następujący kod serializuje się pomyślnie. Konfiguracja MyContext (która nie obsługuje Poco2) jest odrzucana przez konstruktora kopiowania, a serializacja kończy się powodzeniem, ponieważ nowe wystąpienie opcji domyślnie używa serializacji opartej na odbiciu.

var options = new JsonSerializerOptions(MyContext.Default.Options);
JsonSerializer.Serialize(new Poco2(), options);

[JsonSerializable(typeof(Poco1))]
public partial class MyContext : JsonSerializerContext {}

public class Poco1 {}
public class Poco2 {}

Nowe zachowanie

Począwszy od platformy .NET 7, ten sam kod, jak pokazano w sekcji Poprzednie zachowanie , zgłasza błąd InvalidOperationException. Dzieje się tak, ponieważ konstruktor kopiowania zawiera teraz metadane MyContext , które nie obsługują Poco2 kontraktów.

Wprowadzona wersja

.NET 7

Typ zmiany powodującej niezgodność

Ta zmiana może mieć wpływ na zgodność binarną.

Przyczyna wprowadzenia zmiany

JsonSerializerContext było jedynym ustawieniem ignorowane przez konstruktor kopiujący. To zachowanie było zaskakujące dla niektórych użytkowników.

Jeśli zależysz od zachowania platformy .NET 6, możesz ręcznie cofnąć ustawienie TypeInfoResolver właściwości w celu uzyskania rozwiązania kontraktu opartego na odbiciu:

var options = new JsonSerializerOptions(MyContext.Default.Options);
options.TypeInfoResolver = null; // Unset `MyContext.Default` as the resolver for the options instance.

Dotyczy interfejsów API