System.Text.Json リフレクション ベースのシリアライザーでは、以前は遅延読み込みアプローチを使用してプロパティ メタデータを解決しました。 この方法により、サポートされていないプロパティ型を含む POCO は、基になる JSON がサポートされていないプロパティにバインドされていない場合に、正常に逆シリアル化できました。 (これは、同じ型のインスタンスが シリアル化に失敗するという事実にもかかわらずです)。
.NET 8 以降では、すべてのプロパティがシリアル化と逆シリアル化の両方で熱心に解決されるように、シリアライザーが変更されました。 この変更は、複数のリゾルバーを組み合わせるためのより適切なサポートを追加するために行われました。これは、シリアル化された型グラフの早期分析を必要とします。 この変更の副作用は、以前の動作に依存していた場合、新しいランタイム逆シリアル化エラーが発生する可能性があるということです。
以前の動作
.NET 7 では、次の逆シリアル化コードが成功しました。
var result = JsonSerializer.Deserialize<MyPoco>("""{ "Value": 1 }"""); //, MyContext.Default.MyPoco);
Console.WriteLine(result.Value);
public class MyPoco
{
public int Value { get; set; }
public NestedValue Unsupported { get; set; }
}
public class NestedValue
{
public ReadOnlySpan<byte> Span => Array.Empty<byte>();
}
新しい動作
.NET 8 以降では、 前の動作 セクションと同じコードが実行時に InvalidOperationException をスローします。
System.InvalidOperationException: 型 'NestedValue' のプロパティ 'Span' の型 'System.ReadOnlySpan'1[System.Byte]' は、ポインター型、ref 構造体、または特定の型に置き換えされていないジェネリック パラメーターが含まれているため、シリアル化または逆シリアル化に無効です。
このエラーは、以前のバージョンでも、同じ型のインスタンスをシリアル化しようとした際に発生したエラーと一致しています。 また、ソース ジェネレーターと一致しているため、コンパイル時エラーが発生します。
導入されたバージョン
.NET 8 Preview 4
破壊的変更の種類
この変更は 動作の変更です。
変更の理由
この変更は、結合されたソース生成コンテキストでの高速パスシリアル化のサポートに関連する新しい要件によって必要になりました ( dotnet/runtime#71933 を参照)。
推奨されるアクション
この変更に問題がある場合は、次のことができます。
サポートされていないプロパティを型から削除します。
サポートされていない型のカスタム コンバーターを作成します。
JsonIgnoreAttribute属性を追加します。
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }
影響を受ける API
.NET