次の方法で共有


リフレクション ベースの逆シリアライザーによってメタデータが一括で解決される

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