De copyconstructor van JsonSerializerOptions bevat JsonSerializerContext

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.

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.

Betreffende API's