Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#/WPF] Sérialisation et Désérialisation en JSON

Réécriture d'un objet lors de sa désérialisation

Sujet résolu
    13 décembre 2020 à 21:47:39

    Bonsoir,

    J'ai créé un programme dans lequel j'ai besoin d'enregistrer des paramètres. Pour cela, je passe par la Sérialisation/Désérialisation en JSON mais à chaque fois que je relance mon programme, il réécrit le fichier 'settings.json'.

    Je pense que l'erreur vient de mes fonctions que voici :

    public void Save() {
    	byte[] json = JsonSerializer.SerializeToUtf8Bytes<Settings>(this, new JsonSerializerOptions { WriteIndented = true });
    	File.WriteAllBytes("./settings.json", json);
    }
    
    public static Settings LoadOrDefault() {
    	if (File.Exists("./settings.json")) {
    		Settings settings = JsonSerializer.Deserialize<Settings>(File.ReadAllBytes("./settings.json"));
    		if (settings.SerialVersion == Constants.SettingsSerialVersion) return settings;
    	}
    	return new Settings();
    }


    Je les appelle grâce à cela :

    Settings settings;
    settings = Settings.LoadOrDefault();
    settings.Save();


    Même en relisant mon code je ne trouve pas le problème. Si vous avez la moindre idée, je suis preneur.

    Si vous avez besoin de plus d'informations, je vous les fournirai avec plaisir.

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      13 décembre 2020 à 21:54:41

      Si le problème n’apparaît que dans votre IDE, c'est peut-être qu'il est réglé pour écraser celui utilisé au runtime par celui dans le projet/source.

      Vérifiez les paramètres de déploiement associés à ce fichier dans les propriétés du projet.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        13 décembre 2020 à 22:00:08

        Merci de votre réponse rapide.

        Actuellement j'utilise Visual Studio Code et ne peux donc pas modifier les paramètres de déploiement. Cependant lorsque j'exécute le programme en dehors de l'IDE, j'ai le même problème.

        • Partager sur Facebook
        • Partager sur Twitter
          13 décembre 2020 à 22:16:37

          Mettez votre ligne qui appelle "Save" en commentaire, pour vérifier que cela vient bien de ce code.
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            14 décembre 2020 à 15:21:05

            Je ne vois pas le problème (ou ne le comprends pas) mais si vous faites un Save() c'est normal qu'il réécrive le fichier settings.json puisque c'est ce que fait la fonction Save. et si on enchaine LoadOrDefault et Save, on réécrit aussi le fichier (avec les mêmes données lues); bref, le programme fait ce qu'on lui dit de faire.
            • Partager sur Facebook
            • Partager sur Twitter
              14 décembre 2020 à 19:44:41

              Bonjour,

              Je me rends compte que je n'ai pas été assez clair, lorsque je lance le programme, le fichier settings.json est entièrement réécrit avec les valeurs par défaut.

              Pour répondre à bacelar, même en retirant la ligne "settings.Save()" le fichier est toujours réinitialisé. Je ne vois donc pas d'où viens l'erreur. Ce pourrait-il que la fonction "Save()" ne soit pas actualisée lors des modifications de "settings" ? (Je pense au 'this' de la ligne 2)

              Après vérification, le fichier est correctement modifié. Cependant la fonction "LoadOrDefault()" semble réinitialiser les paramètres. Le "return new Settings()" final y-serait-il pour quelque chose ?

              -
              Edité par charlesarbaud 14 décembre 2020 à 20:00:35

              • Partager sur Facebook
              • Partager sur Twitter
                14 décembre 2020 à 20:35:49

                Utilisez le débogueur pour vérifier que vous sortez bien par la ligne 9 et non la ligne 11, quand le fichier existe.
                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  14 décembre 2020 à 21:21:18

                  Finalement j'ai trouvé et réglé le problème, j'avais mis mes propriété en "protected set". Je n'avais pas pensé que l'appel de la fonction LoadOrDefault serait considéré comme externe (puisque défini dans la même classe).

                  A la désérialisation, les propriétés n'étaient pas modifiées (et restaient donc vide) et à l'enregistrement suivant, les données étaient écrasées.

                  Je marque donc le sujet comme résolu.

                  Merci pour votre aide.

                  -
                  Edité par charlesarbaud 14 décembre 2020 à 21:49:22

                  • Partager sur Facebook
                  • Partager sur Twitter

                  [C#/WPF] Sérialisation et Désérialisation en JSON

                  × 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