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