次の方法で共有


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

.NET 6 でのソース生成のリリースでは、 JsonSerializerOptions コピー コンストラクターは意図的にその JsonSerializerContext 状態を無視するように作成されました。 これは、 JsonSerializerContextJsonSerializerOptions インスタンスと 1 対 1 の関係を持つよう設計されていたため、当時は理にかなっていました。 .NET 7 では、 IJsonTypeInfoResolver はコンテキストを一般化するために JsonSerializerContext を置き換えます。これにより、 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