Partager via


Migrer vers System.Text.Json (JSON)

Par défaut, la bibliothèque System.Text.Json met en évidence le comportement littéral, déterministe et évite toute estimation ou interprétation au nom de l’appelant. La bibliothèque est intentionnellement conçue de cette façon à des fins de sécurité et de performances. Bien que System.Text.Json soit hautement configurable et que ses fonctionnalités puissent être utilisées pour minimiser les modifications nécessaires aux types sérialisés, il est important de prendre en compte les compromis entre la gestion des types existants avec le moins de modifications possible et la refactorisation des types pour permettre une serialization idiomatique et sécurisée.

Lors de la migration de BinaryFormatter vers System.Text.Json, il est essentiel de noter les comportements et options suivants :

  • Par défaut, les champs ne sont pas sérialisés ou désérialisés par System.Text.Json, mais ils peuvent être annotés pour serialization. Vous pouvez également définir avec précaution JsonSerializerOptions.IncludeFields sur true pour inclure tous les champs publics pour les types sérialisés.

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • Par défaut, System.Text.Json ignore les propriétés et champs privés. Vous pouvez activer l’utilisation d’un accesseur non public sur une propriété à l’aide de l’attribut [JsonInclude]. L’inclusion de champs privés nécessite un travail supplémentaire non trivial.

  • System.Text.Jsonne peut pas désérialiser des champs en lecture seule ou des propriétés, mais l’attribut [JsonConstructor] peut être utilisé pour indiquer que le constructeur spécifié doit être utilisé pour créer des instances du type lors de la désérialisation. Le constructeur peut définir les champs et propriétés en lecture seule.

  • Pour remplacer le comportement serialization par défaut d’un type spécifique, vous pouvez écrire des convertisseurs personnalisés.

  • Il prend en charge la serialization et la désérialisation de nombreuses collections, mais avec des limites. Pour en savoir plus sur les collections prises en charge pour la serialization et la désérialisation, consultez la documentation sur les types de collection pris en charge.

  • Dans certaines conditions, il prend en charge la serialization et la désérialisation de collections génériques personnalisées.

  • Voici d’autres types sans prise en charge intégrée : DataSet, DataTable, DBNull, TimeZoneInfo, Type, ValueTuple. Toutefois, vous pouvez écrire un convertisseur personnalisé pour prendre en charge ces types.

  • Il prend en charge la serialization et la désérialisation des hiérarchies de types polymorphes où les types ont été explicitement activés via l’attribut ou convertisseur personnalisé [JsonDerivedType]. Les hiérarchies d’héritage ouvertes ne sont pas prises en charge et l’aller-retour avec polymorphisme nécessite des identificateurs de discriminateur de type pour tous les types dérivés connus.

  • L’attribut [JsonIgnore] sur une propriété entraîne l’omission de la propriété dans le JSON pendant la serialization.

  • Pour conserver les références et gérer les références circulaires dans System.Text.Json, définissez JsonSerializerOptions.ReferenceHandler sur ReferenceHandler.Preserve.

  • Serialization peut être largement personnalisé avec des contrats personnalisés, ce qui débloque de nombreux scénarios tout en réduisant les modifications apportées aux types sérialisés.