Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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).
Doporučená akce
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; } }