Deserializátor založený na reflexi rychle řeší metadata.

System.Text.Json serializátor založený na reflexi dříve používal líný přístup k načítání k vyřešení metadat vlastností. Tento přístup umožnil úspěšnou deserializaci POCO objektů, které obsahovaly nepodporované typy vlastností, za předpokladu, že podkladový JSON nevázal na žádnou z nepodporovaných vlastností. (To bylo i přes skutečnost, že instance stejného typu se nedařilo serializovat.)

Počínaje rozhraním .NET 8 byl serializátor změněn tak, aby všechny vlastnosti byly vyřešeny okamžitě jak při serializaci, tak při deserializaci. Tato změna byla provedena tak, aby byla přidána lepší podpora pro kombinování několika resolverů, což vyžaduje časnou analýzu grafu typů. Vedlejším účinkem této změny je, že pokud jste se spoléhali na předchozí chování, mohly by se začít objevovat nové chyby deserializace za běhu.

Předchozí chování

Následující deserializační kód byl úspěšný v .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>();
}

Nové chování

Počínaje rozhraním .NET 8 vyvolá stejný kód z předchozí části chování za InvalidOperationException běhu.

System.InvalidOperationException: Typ System.ReadOnlySpan 1[System.Byte] vlastnosti Span u typu NestedValue je neplatný pro serializaci nebo deserializaci, protože se jedná o typ ukazatele, je struktura odkazu nebo obsahuje obecné parametry, které nebyly nahrazeny konkrétními typy.

Tato chyba je konzistentní s chybou, která byla vyvolána i v předchozích verzích, pokud jste se pokusili serializovat instanci stejného typu. Je také konzistentní se zdrojovým generátorem, který vytváří chybu v době kompilace.

Verze byla představena

.NET 8 Preview 4

Typ zásadní změny

Tato změna je změna chování.

Důvod změny

Tato změna byla vyžadována novými požadavky souvisejícími s podporou serializace rychlých cest v kombinovaných kontextech generovaných zdrojem (viz dotnet/runtime#71933).

Pokud je tato změna pro vás problematická, můžete:

  • Odeberte nepodporovanou vlastnost z vašeho typu.

  • Vytvořte vlastní převaděč pro nepodporovaný typ.

  • JsonIgnoreAttribute Přidejte atribut:

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

Ovlivněná rozhraní API