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