Partager via


Le désérialiseur basé sur la réflexion résout promptement les métadonnées

Le sérialiseur basé sur la réflexion System.Text.Json utilisait précédemment une approche de chargement différé pour résoudre les métadonnées de propriété. Cette approche permettait 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 parvenaient 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 pouviez 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

À partir de .NET 8, le même code que celui indiqué dans la section Comportement précédent lève un InvalidOperationException à 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 ou d’un ref struct, ou il 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 l’erreur levé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, qui génère une erreur de compilation.

Version introduite

.NET 8 Preview 4

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Cette modification était requise par de nouvelles exigences liées à la prise en charge de la sérialisation de chemin rapide dans des contextes générés par source combinés (voir dotnet/runtime#71933).

Si cette modification est problématique pour vous, vous pouvez :

  • Supprimer la propriété non prise en charge de votre type.

  • Créer un convertisseur personnalisé pour le type non pris en charge.

  • Ajouter l’attribut JsonIgnoreAttribute :

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

API affectées