JsonSerializerOptions コピー コンストラクターに JsonSerializerContext が含まれる

.NET 6 のソース生成のリリースでは、その JsonSerializerContext 状態を無視する目的で JsonSerializerOptions コピー コンストラクターが意図的に作成されました。 JsonSerializerContextJsonSerializerOptions インスタンスと 1:1 の関係が与えられるように設計されていたため、当時は理にかなっていました。 .NET 7 では、IJsonTypeInfoResolverJsonSerializerContext に変更し、コンテキストを一般化します。それにより、JsonSerializerOptionsJsonSerializerContext を緊密に結合する必要がなくなります。 コピー コンストラクターには IJsonTypeInfoResolver/JsonSerializerContext 情報が含まれるようになりました。この情報は、一部のシナリオにとって破壊的変更として現れる可能性があります。

以前の動作

.NET 6 では、次のコードで正常にシリアル化されます。 MyContext 構成 (Poco2 をサポートしない) はコピー コンストラクターによって破棄されます。新しいオプションでは既定でリフレクションベースのシリアル化を使用するようになるため、シリアル化は成功します。

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 {}

新しい動作

.NET 7 以降では、「以前の動作」セクションで示されている同じコードにより InvalidOperationException がスローされます。 これは、コピー コンストラクターによって MyContext メタデータ (Poco2 コントラクトがサポートされない) が組み込まれるようになったためです。

導入されたバージョン

.NET 7

破壊的変更の種類

この変更は、バイナリの互換性に影響を与える可能性があります。

変更理由

JsonSerializerContext は、コピー コンストラクターによって無視される唯一の設定でした。 この動作は一部のユーザーにとって驚きでした。

.NET 6 の動作に依存している場合、TypeInfoResolver プロパティの設定を手動で解除し、リフレクションベースのコントラクト解決に戻すことができます。

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

影響を受ける API