Share via


Deserializer op basis van weerspiegeling lost metagegevens gretig op

De serialisatiefunctie op basis van System.Text.Json gebruikte eerder een luie laadbenadering om eigenschappenmetagegevens op te lossen. Deze benadering heeft poCOs die niet-ondersteunde eigenschapstypen bevatten, mogelijk gemaakt om deserialiseren succesvol te deserialiseren, mits de onderliggende JSON geen binding heeft gemaakt met een van de niet-ondersteunde eigenschappen. (Dit was ondanks het feit dat exemplaren van hetzelfde type niet serialiseren.)

Vanaf .NET 8 is de serializer gewijzigd, zodat alle eigenschappen gretig worden omgezet in zowel serialisatie als deserialisatie. Deze wijziging is aangebracht om betere ondersteuning toe te voegen voor het combineren van meerdere resolvers, wat vroege analyse van de geserialiseerde typegrafiek vereist. Een neveneffect van deze wijziging is dat als u afhankelijk was van het vorige gedrag, nieuwe runtimedeserialisatiefouten zou kunnen zien.

Vorig gedrag

De volgende deserialisatiecode is geslaagd in .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>();
}

Nieuw gedrag

Vanaf .NET 8 genereert dezelfde code uit de sectie Vorig gedrag een InvalidOperationException runtime.

System.InvalidOperationException: Het type 'System.ReadOnlySpan'1[System.Byte]' van eigenschap 'Span' voor het type NestedValue is ongeldig voor serialisatie of deserialisatie omdat het een aanwijzertype is, een verwijzingsstruct is of algemene parameters bevat die niet zijn vervangen door specifieke typen.

Deze fout is consistent met de fout die zelfs in eerdere versies is opgetreden als u een exemplaar van hetzelfde type hebt geserialiseerd. Het is ook consistent met de brongenerator, die een compileertijdfout produceert.

Versie geïntroduceerd

.NET 8 Preview 4

Type wijziging die fouten veroorzaken

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze wijziging is vereist door nieuwe vereisten met betrekking tot ondersteuning voor snelpadserialisatie in gecombineerde door bron gegenereerde contexten (zie dotnet/runtime#71933).

Als deze wijziging problematisch voor u is, kunt u het volgende doen:

  • Verwijder de niet-ondersteunde eigenschap uit uw type.

  • Een aangepast conversieprogramma maken voor het niet-ondersteunde type.

  • Voeg het JsonIgnoreAttribute kenmerk toe:

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

Betrokken API's