Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met de release van brongeneratie in .NET 6 is de JsonSerializerOptions kopieerconstructor opzettelijk zo ontworpen dat hij de JsonSerializerContext status negeert. Dit was destijds logisch omdat JsonSerializerContext was ontworpen om een 1:1-relatie met JsonSerializerOptions instellingen te hebben. In .NET 7 vervangt IJsonTypeInfoResolverJsonSerializerContext om de context te generaliseren, waardoor de noodzaak van strakke koppeling tussen JsonSerializerOptions en JsonSerializerContext verdwijnt. De kopieerconstructor bevat nu de IJsonTypeInfoResolver/JsonSerializerContext informatie, wat zou kunnen leiden tot een brekende verandering voor sommige scenario's.
Vorig gedrag
In .NET 6 wordt de volgende code succesvol geserialiseerd. De MyContext configuratie (die geen ondersteuning biedt voor Poco2) wordt verwijderd door de kopieerconstructor, en serialisatie slaagt omdat de nieuwe opties standaard gebruikmaken van weerspiegelingsgebaseerde serialisatie.
var options = new JsonSerializerOptions(MyContext.Default.Options);
JsonSerializer.Serialize(new Poco2(), options);
[JsonSerializable(typeof(Poco1))]
public partial class MyContext : JsonSerializerContext {}
public class Poco1 {}
public class Poco2 {}
Nieuw gedrag
Vanaf .NET 7 gooit dezelfde code als getoond in de sectie Vorige gedraging een InvalidOperationException. Dat komt doordat de kopieerconstructor nu metagegevens bevat MyContext die geen ondersteuning bieden voor Poco2 contracten.
Geïntroduceerde versie
.NET 7
Type van brekende verandering
Deze wijziging kan van invloed zijn op binaire compatibiliteit.
Reden voor wijziging
JsonSerializerContext was de enige instelling genegeerd door de kopieerconstructor. Dit gedrag was verrassend voor sommige gebruikers.
Aanbevolen actie
Als u afhankelijk bent van het gedrag van .NET 6, kunt u de TypeInfoResolver eigenschap handmatig ongedaan maken om terug te keren naar contractoplossing op basis van reflectie:
var options = new JsonSerializerOptions(MyContext.Default.Options);
options.TypeInfoResolver = null; // Unset `MyContext.Default` as the resolver for the options instance.