Partage
  • Partager sur Facebook
  • Partager sur Twitter

Désérialiser une classe qui implémente IEnumerable

    30 novembre 2022 à 2:51:21

    Bonjour,

    Je suis en train de faire un petit programme qui permet de sérialiser/désérialiser une classe en Json.

    Ce programme, je le fais .NET 7 et j'utilise donc System.Text.Json

    J'ai donc une interface ITest. Cette interface est implémentée dans deux classes TestSuite et TestCase.

    [JsonDerivedType(typeof(TestSuite), "testSuite")]
    [JsonDerivedType(typeof(TestCase), "testCase")]
    [JsonPolymorphic(UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToNearestAncestor)]
    public interface ITest
    {
    }
    public class TestCase : ITest
    {
        public string Name { get; set; }
    }
    public class TestSuite : ITest, IEnumerable<ITest>
    {
        private readonly List<ITest> _tests = new ();
    
        public void Add(ITest test)
        {
            _tests.Add(test);
        }
    
        /// <inheritdoc />
        public IEnumerator<ITest> GetEnumerator()
        {
            return _tests.GetEnumerator();
        }
    
        /// <inheritdoc />
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }

    Et pour tester, je fais donc:

    ITest suite = new TestSuite { new TestCase { Name = "Oui" }, new TestCase { Name = "Test2" } };
    
    string json = JsonSerializer.Serialize(suite);
    
    var s = JsonSerializer.Deserialize<ITest>(json);
    
    Console.WriteLine(json);

    La sérialisation et désérialisation de TestCase fonctionnent parfaitement.

    Mais pour TestSuite, la désérialisation échoue avec le message d'erreur :

    System.NotSupportedException: 'The collection type 'Test.TestSuite' is abstract, an interface, or is read only, and could not be instantiated and populated. Path: $.$values | LineNumber: 0 | BytePositionInLine: 32.'

    Je ne peux pas utiliser de JsonConverter personnalisé car le json polymorphisme ne prend en charge que les json converter par défaut.

    Savez-vous comment je pourrais résoudre ce problème ?

    Merci d'avance,

    -
    Edité par SuperYUKO 30 novembre 2022 à 2:51:43

    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2022 à 11:37:16

      Bonjour,

      Le message est clair, votre liste est en read only...

      • Partager sur Facebook
      • Partager sur Twitter
        1 décembre 2022 à 18:42:44

        Bonjour,

        Le problème n'est pas que la liste est readonly, mais qu'il est impossible de désérialiser une interface.
        Il faut absolument utiliser une class accessible et non abstraite.
        • Partager sur Facebook
        • Partager sur Twitter

        Désérialiser une classe qui implémente IEnumerable

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown