Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le sérialiseur basé sur la réflexion System.Text.Json a précédemment utilisé une approche de chargement différée pour résoudre les métadonnées de propriété. Cette approche a permis aux POCO qui contenaient des types de propriétés non pris en charge de désérialiser correctement, à condition que le JSON sous-jacent ne soit lié à aucune des propriétés non prises en charge. (Cela malgré le fait que les instances du même type ne parviennent pas à sérialiser.)
À compter de .NET 8, le sérialiseur a été modifié afin que toutes les propriétés soient résolues promptement dans la sérialisation et la désérialisation. Cette modification a été apportée pour ajouter une meilleure prise en charge de la combinaison de plusieurs résolveurs, ce qui nécessite une analyse précoce du graphique de type sérialisé. Un effet secondaire de cette modification est que si vous dépendiez du comportement précédent, vous pouvez commencer à voir de nouvelles erreurs de désérialisation du runtime.
Comportement précédent
Le code de désérialisation suivant a réussi dans .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>();
}
Nouveau comportement
À compter de .NET 8, le même code de la section Comportement précédent lève un InvalidOperationException au moment de l’exécution.
System.InvalidOperationException : le type « System.ReadOnlySpan » 1[System.Byte] de la propriété « Span » sur le type « NestedValue » n’est pas valide pour la sérialisation ou la désérialisation, car il s’agit d’un type de pointeur, est un struct ref ou contient des paramètres génériques qui n’ont pas été remplacés par des types spécifiques.
Cette erreur est cohérente avec celle qui était générée même dans les versions précédentes si vous tentiez de sérialiser une instance du même type. Il est également cohérent avec le générateur source, ce qui génère une erreur au moment de la compilation.
Version introduite
.NET 8 Preview 4
Type de changement cassant
Ce changement est un changement de comportement.
Raison de la modification
Cette modification était nécessaire en raison de nouvelles exigences liées à la prise en charge de la sérialisation rapide dans des contextes générés par la combinaison de sources (voir dotnet/runtime#71933).
Action recommandée
Si cette modification est problématique pour vous, vous pouvez :
Supprimez la propriété non prise en charge de votre type.
Créez un convertisseur personnalisé pour le type non pris en charge.
Ajoutez l’attribut JsonIgnoreAttribute :
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }