Les constructeurs sans paramètre et non publics ne sont pas utilisés pour la désérialisation

Pour la cohérence entre tous les monikers de la version cible de .Net Framework (TFM) pris en charge, les constructeurs non publics et sans paramètre ne sont plus utilisés pour la désérialisation avec JsonSerializer, par défaut.

Description de la modification

Les packages NuGet System.Text.Json autonomes qui prennent en charge .NET Standard 2.0 et versions ultérieures, c’est-à-dire les versions 4.6.0-4.7.2, se comportent de manière incohérente avec le comportement intégré sur .NET Core 3.0 et 3.1. Sur .NET Core 3.x, des constructeurs internes et privés peuvent être utilisés pour la désérialisation. Dans les packages autonomes, les constructeurs non publics ne sont pas autorisés et une MissingMethodException est levée si aucun constructeur public sans paramètre n’est défini.

À compter de .NET 5 et du package NuGet System.Text.Json 5.0.0, le comportement est cohérent entre le package NuGet et les API intégrées. Les constructeurs non publics, y compris les constructeurs sans paramètre, sont ignorés par le sérialiseur par défaut. Le sérialiseur utilise l’un des constructeurs suivants pour la désérialisation :

  • Constructeur public annoté avec JsonConstructorAttribute.
  • Constructeur public sans paramètre.
  • Constructeur paramétrisé public (s’il s’agit du seul constructeur public présent).

Si aucun de ces constructeurs n’est disponible, une NotSupportedException est levée si vous tentez de désérialiser le type.

Version introduite

5,0

Raison du changement

  • Pour appliquer un comportement cohérent entre tous les monikers de la version cible de .Net Framework (TFMs) que System.Text.Json génère (.NET Core 3.0 et versions ultérieures et .NET Standard 2.0)
  • Car JsonSerializer ne doit pas appeler la surface non publique d’un type, qu’il s’agisse d’un constructeur, d’une propriété ou d’un champ.
  • Si vous êtes propriétaire du type et qu’il est faisable, rendez le constructeur sans paramètre public.
  • Sinon, implémentez un JsonConverter<T> pour le type et contrôlez le comportement de désérialisation. Vous pouvez appeler un constructeur non public à partir d’une implémentation JsonConverter<T> si les règles d’accessibilité C# pour ce scénario l’autorisent.

API affectées