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 peuvent être utilisées pour réduire 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 plus peu de modifications possible par rapport aux types de refactorisation pour permettre la sérialisation 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 la sérialisation. 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.Jsonignore 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 de sérialisation par défaut pour un type spécifique, vous pouvez écrire des convertisseurs personnalisés.

  • Il prend en charge la sérialisation et la désérialisation de nombreuses collections, mais il existe des limitations. Consultez la documentation sur les types pris en charge pour savoir quels types et collections sont pris en charge pour la sérialisation et la désérialisation.

  • Sous certaines conditions, il prend en charge la sérialisation 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 sérialisation et la désérialisation de la hiérarchie des types polymorphes lorsque les types ont été explicitement choisis via l'attribut ou le 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é à partir du JSON pendant la sérialisation.

  • 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.