Freigeben über


Reflektionsbasiertes Deserialisierungsmodul löst Metadaten eifrig auf

Das reflektionsbasierte Serialisierungsmodul „System.Text.Json“ hat zuvor einen Lazy Loading-Ansatz verwendet, um Eigenschaftsmetadaten aufzulösen. Dieser Ansatz ermöglichte es POCOs, die nicht unterstützte Eigenschaftstypen enthalten, erfolgreich zu deserialisieren, vorausgesetzt, dass der zugrunde liegende JSON nicht an nicht unterstützte Eigenschaften gebunden wurde. (Dies geschah trotz der Tatsache, dass Instanzen desselben Typs nicht serialisiert werden konnten.)

Ab .NET 8 wurde das Serialisierungsmodul geändert, sodass alle Eigenschaften sowohl bei der Serialisierung als auch bei der Deserialisierung aufgelöst werden. Diese Änderung wurde vorgenommen, um eine bessere Unterstützung für die Kombination mehrerer Resolver hinzuzufügen, was eine frühzeitige Analyse des serialisierten Typdiagramms erfordert. Eine Begleiterscheinung dieser Änderung besteht darin, dass bei einer Abhängigkeit vom vorherigen Verhalten neue Deserialisierungsfehler zur Runtime angezeigt werden können.

Vorheriges Verhalten

Der folgende Deserialisierungscode war in .NET 7 erfolgreich.

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>();
}

Neues Verhalten

Ab .NET 8 löst der gleiche Code wie im Abschnitt Vorheriges Verhalten eine InvalidOperationException aus.

System.InvalidOperationException: Der Typ „System.ReadOnlySpan'1[System.Byte]“ der Eigenschaft „Span“ des Typs „NestedValue“ ist für die Serialisierung oder Deserialisierung ungültig, da es sich um einen Zeigertyp oder eine Verweisstruktur handelt oder er generische Parameter enthält, die nicht durch bestimmte Typen ersetzt wurden.

Dieser Fehler entspricht dem Fehler, der auch in früheren Versionen ausgelöst wurde, wenn Sie versucht haben, eine Instanz desselben Typs zu serialisieren. Er entspricht auch dem Quellgenerator, was zu einem Kompilierzeitfehler führt.

Eingeführt in Version

.NET 8 Vorschauversion 4

Typ des Breaking Changes

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Diese Änderung wurde durch neue Anforderungen im Zusammenhang mit der Unterstützung für die Serialisierung von schnellen Pfaden in kombinierten aus der Quelle generierten Kontexten erforderlich (siehe dotnet/runtime#71933).

Wenn diese Änderung für Sie problematisch ist, können Sie Folgendes tun:

  • Entfernen Sie die nicht unterstützte Eigenschaft aus Ihrem Typ.

  • Erstellen Sie einen benutzerdefinierten Konverter für den nicht unterstützten Typ.

  • Fügen Sie das Attribut „JsonIgnoreAttribute“ hinzu:

    public class MyPoco
    {
        public int Value { get; set; }
    
        [JsonIgnore]
        public NestedValue Unsupported { get; set; }
    }
    

Betroffene APIs