none
Sauvegarde et serialisation RRS feed

  • Question

  • Bonjours à tous.

    Dans une Class "BEE_ELEVES" contenant une méthode permettant d'enregistrer un fichier après sérialisation en XML.

    public async void CreationFile(string chemin)
     
                {
     
                    StorageFile fichier = await ApplicationData.Current.LocalFolder.CreateFileAsync(chemin, CreationCollisionOption.OpenIfExists);
     
                    Stream sw = await fichier.OpenStreamForWriteAsync();
     
     
     
                    // Sérialisation des données
     
                    XmlSerializer ser = new XmlSerializer(typeof(BEE_ELEVES));
     
                    ser.Serialize(sw, this);
     
     
     
                    // Fermeture du stream
     
                    await sw.FlushAsync();   
     
                }

    Ce code fonctionne... J'ai également une méthode qui lit le fichier XML

    public async Task<BEE_ELEVES> LectureFile(string chemin)
     
                {
     
                    // Récupération du stream du fichier contenant les données sérialisées
     
                    StorageFile fichier = await ApplicationData.Current.LocalFolder.CreateFileAsync(chemin, CreationCollisionOption.OpenIfExists);
     
                    Stream sw = await fichier.OpenStreamForReadAsync();
     
     
     
                    // Désérialisation des données
     
                    XmlSerializer deser = new XmlSerializer(typeof(BEE_ELEVES));
     
                    BEE_ELEVES mc = (BEE_ELEVES)deser.Deserialize(sw);
     
     
     
                    // Fermeture du stream
     
                    await sw.FlushAsync();
     
     
     
                    return mc;
     
                }

    Lorsque je lance le programme, pour créer le fichier pas de problème.

    Lorsque je lance le programme, pour lire le fichier pas de problème.

    par contre si je lance le programme, pour créer le fichier et que dans la foulé je souhaite le lire, une exception est déclenché.

    • Une exception de type 'System.UnauthorizedAccessException' s'est produite dans mscorlib.dll mais n'a pas été gérée dans le code utilisateur
      Informations supplémentaires : Accès refusé. (Exception de HRESULT : 0x80070005 (E_ACCESSDENIED))

     Le fichier après écriture semble être en lecture seule.

    Une idée ????


    samedi 5 juillet 2014 13:29

Réponses

  • Bonjour,

    oui une première petite idée: libérez le Stream avec un sw.Dispose();

    Ensuite j'ai évité dans mon programme de retourner un void sur une fonction avec 'async'. La raison est que quand on utilise un retour void, cette fonction n'attend pas la fin de l'execution. alors qu'en utilsant un type de retour (bool par exemple) la fonction sort à la fin de l'opération.

    Dans votre cas, si vous créez et lisez dans la foulée il est possible qu'il n'ai pas finis d'écrire que vous tentiez d'ouvrir en lecture. Ce qui expliquerait votre code d'erreur.


    JMK

    samedi 5 juillet 2014 15:07

Toutes les réponses

  • Bonjour,

    oui une première petite idée: libérez le Stream avec un sw.Dispose();

    Ensuite j'ai évité dans mon programme de retourner un void sur une fonction avec 'async'. La raison est que quand on utilise un retour void, cette fonction n'attend pas la fin de l'execution. alors qu'en utilsant un type de retour (bool par exemple) la fonction sort à la fin de l'opération.

    Dans votre cas, si vous créez et lisez dans la foulée il est possible qu'il n'ai pas finis d'écrire que vous tentiez d'ouvrir en lecture. Ce qui expliquerait votre code d'erreur.


    JMK

    samedi 5 juillet 2014 15:07
  • Super ... Ça fonctionne pour le sw.Dispose(); Merci beaucoup.

    Quand je dis dans la foulée, en fait, c'est dans la même session du programme.

    Par contre une fonction 'async' ne permet pas un retour du type 'bool', les seuls retours acceptés sont

    'void', 'Task' et 'Task<T>'... 

    Encore Merci.

    samedi 5 juillet 2014 15:48