IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Comment serializer l'écriture des erreurs dans un fichier


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [C#] Comment serializer l'écriture des erreurs dans un fichier
    Bonjour à tous !

    Voilà mon souci,
    je voudrais serializer l'écriture des erreurs dans un fichier xml.
    J'ai donc écrit une classe Error() qui est comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Security.Permissions;
    using System.Security.AccessControl;
    using System.Xml.Serialization;
    namespace treeview
    {
        class Error
        {
            private string _path = @"c:\debug_tree.xml";
            private FileStream _fs;
            private StreamWriter _stw;
            private XmlSerializer _serializer;
            private string _error;
     
            public Error()
            {
                _serializer = new XmlSerializer(typeof(String));
     
            }
            public void Write(Exception e)
            {
     
                _error = DateTime.Now.ToShortDateString() + " : " + DateTime.Now.ToShortTimeString() + " - " + e.Message.Replace('\n', '.');
                _fs = new FileStream(_path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
                _stw = new StreamWriter(_fs);
                _serializer.Serialize(_stw,_error);
                _stw.Close();
                _fs.Close();
                _stw.Dispose();
                _fs.Dispose();
            }
     
        }
    }
    Et lorsque dans mon applicatio, je récupère une erreur, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    new Error().Write(e);
    où e est une exception.


    Mais voilà ce que j'obtiens comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
     
    <?xml version="1.0" encoding="utf-8"?>
    <string>16/11/2006 : 16:30 - L'accès au chemin d'accès 'C:\System Volume Information' est refusé.</string><?xml version="1.0" encoding="utf-8"?>
    <string>16/11/2006 : 16:30 - L'accès au chemin d'accès 'D:\System Volume Information' est refusé.</string><?xml version="1.0" encoding="utf-8"?>
    <string>16/11/2006 : 16:30 - Le périphérique n'est pas prêt.
    .</string><?xml version="1.0" encoding="utf-8"?>
    <string>16/11/2006 : 16:30 - Le périphérique n'est pas prêt.
    .</string>
    La chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    <?xml version="1.0" encoding="utf-8"?>
    est réécrite à chaque erreur ?
    pourquoi ??
    y a visiblement plein de choses que je comprends pas avec ma serialization ...
    Comment résoudre ce problème ??

    merci beaucoup pour votre aide !!!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    Salut,

    A mon avis le probème vient de ton code qui est déclencé à CHAQUE erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new Error().Write(e);
    1-l'appel au constructeur (new Error()) instancie un nouveau XmlSerializer qui génére un flux XMl qui pour être valide contient l'entête standard suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?xml version="1.0" encoding="utf-8"?>
    2-l'appel à la méthode Write ouvre un fichier en mode ajout, le fichier xml contiendra en fin d'appel le flux suivant pour la première erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?xml version="1.0" encoding="utf-8"?>
    <string>16/11/2006 : 16:30 - L'accès au chemin d'accès 'C:\System Volume Information' est refusé.</string>
    Ensuite le fichier est refermé et le cycle recommence à la prochaine erreur tu me suis ? (goto 1)

    une façon de le résoudre est de faire en sorte de n'avoir QU'UN objet XmlSerializer. Tu px essayer de le déclarer en static par exemple... bonne chance.
    Mobile first !
    Développeur & co-fondateur de appSoluce ! - développement de solutions mobiles cross-platform

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour madfu et merci pour ta réponse,

    je me suis dit la même chose, la création d'un objet error à chaque fois provoque la création d'un nouveau xmlserializer aussi.

    J'ai donc fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    namespace treeview
    {
        class Error
        {
            private string _path ;
            private FileStream _fs;
            private StreamWriter _stw;
            private XmlSerializer _serializer;
            private string _error;
     
            public Error()
            {
                _serializer = new XmlSerializer(typeof(String));
                _path = @"c:\debug_tree_"+randomLogIdentifier()+"_.xml";
                _fs = new FileStream(_path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
                _stw = new StreamWriter(_fs);
     
     
            }
            public void Write(Exception e)
            {
     
                _error = DateTime.Now.ToShortDateString() + " : " + DateTime.Now.ToShortTimeString() + " - " + e.Message.Replace('\n', '.');
                _serializer.Serialize(_stw,_error);
            }
     
            private string randomLogIdentifier()
            {
                int min =0;
                int max =10000;
                Random rnd = new Random();
                return rnd.Next(min, max).ToString();
            }
            public void closeErrorLog()
            {
                _stw.Close();
                _fs.Close();
                _stw.Dispose();
                _fs.Dispose();
     
            }
        }
    }
    Au chargement de mon application principale, je créé une seule fois un objet de ma classe Error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    _error = new Error()
    et quand je dois géré une exception, je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    _error.Write(e);
    Quand je quitte l'application, j'appelle la méthode closeErrorLog() pour libéré l'accès au fichier.


    Mais j'obtiens toujours le même résultat ...

    je ne comprends pas
    tout le monde est d'accord pour critiquer la pensée unique

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    Juste une question, pourquoi sérialiser ?

    Si j'ai bien compris l'aide, le XMLSerializer sert à sérializer les attributs publics d'un objet donné dans un format XML.

    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _serializer.Serialize(_stw,_error);
    Tu ne fais rien d'autre que sérializer dans un flux XML des attributs publics de ta variable _error....donc sa valeur puisque c'est une chaine. Je crois que cette méthode ne fait que ça, transformer un objet en un flux XML "délimité" (avec un début et une fin).

    Je ne crois pas que la sérialisation soit la méthode appropriée ici. L'écriture dans un fichier (au format XML si tu y tiens) devrait se faire de façon standard dans ton cas je pense.
    Mobile first !
    Développeur & co-fondateur de appSoluce ! - développement de solutions mobiles cross-platform

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par madfu
    Si j'ai bien compris l'aide, le XMLSerializer sert à sérializer les attributs publics d'un objet donné dans un format XML.
    En règle générale la sérialisation sert à transformer un objet dans un format qui pourra être sauvegardé sur fichier, envoyé sur le réseau, ...
    Bref, en règle générale, lorsque l'on sérialise un objet sur fichier c'est pour pouvoir le désérialiser/recharger par la suite, par exemple après un redémarrage de l'application.

    LE NEINDRE, dans ton cas, vu que tu cherches en gros à faire un fichier de log, pourquoi ne pas utiliser les fonctions de Trace fournies par le framework?
    Si écrire dans un fichier de texte ne te convient pas (c'est pourtant bien plus simple ), tu pourrais créer ton propre listeneur qui pourrait, lui, se charger d'écrire en XML sur un fichier si vraiment tu désires utiliser XML.

    Pour écrire dans un XML, il existe une quirielle de classes et fonctions fournies avec le framework.

    Exemple de code pour écrire dans un fichier XML :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Dim settings As New XmlWriterSettings()
    settings.Indent = True
    settings.IndentChars = "    "
    settings.ConformanceLevel = ConformanceLevel.Auto
     
    Using writer As XmlWriter = XmlWriter.Create("essai.xml", settings)
     
    	With writer
    		.WriteStartElement("Part")
     
    		.WriteElementString("mon_texte", "Coucou")
     
    		.WriteEndElement()
     
    		.Flush()
    		.Close()
    	End With
    End Using

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Merci pour vos réponses madFu et nicolasJolet,
    En effet dans mon cas, c'est pas du tout utile.
    Je vais plutôt écrire simplement une log d'erreur texte ou xml.

    J'ai dautre part pu voir comment marche la sérialization xml à travers une partie de mon appli.
    juste une question à ce sujet, est-ce que la sérialisation accélère beaucoup l'écriture dans un fichier, et pourquoi ? Désolé pour ces questions peut-être banales, mais bon ....
    tout le monde est d'accord pour critiquer la pensée unique

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    En terme de vitesse d'écriture physique non, ça ne change absolument rien...

    En terme de vitesse d'exécution du code, ça doit être sensiblement pareil voire un peu plus rapide que si tu "parsais" ton objet à la main et que tu l'écrivais toi-même dans un fichier; comme dans la plupart des cas où tu fais "à la main" ce que des fonctions du framework optimisées font déjà.

    Mais là où la sérialisation est vraiment intéressante en terme de vitesse d'écriture de code (lorsque tu tapes sur ton clavier ), c'est lorsque tu dois, par exemple, sauver un objet qui contient les paramètres de ton application.
    Ca prend à tout casser 10 lignes de codes pour sauver et charger tous les paramètres de ton application, peu importe qu'il y en ai 10 ou 500...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Est-ce que tu entends par paramètres d'application, par exemple, les informations sur les nodes cochés d'un treeview ?
    tout le monde est d'accord pour critiquer la pensée unique

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    J'ai dit "paramètres de l'application" mais ça peut-être absolument tout ce que tu veux.
    Tout objet noté comme sérialisable peut être sérialisé.
    Maintenant il faut voir s'il y a un intérêt à cela, et puis il faut bien tenir compte du fait que sérialiser un objet comporte aussi des inconvénients : si tu changes le design de ton objet, tu ne sauras plus le désérialiser.
    A toi de voir dans quel cas c'est intéressant ou pas

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Ok, merci pour toutes ces informations interessantes
    tout le monde est d'accord pour critiquer la pensée unique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/05/2013, 10h04
  2. Configuration des erreur dans un fichier ini
    Par Jcpan dans le forum MVC
    Réponses: 10
    Dernier message: 22/09/2012, 00h55
  3. Détection des erreurs dans un fichier texte (txt)
    Par M E H D I dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/05/2010, 10h14
  4. [Lazarus] Comment obtenir la liste des ressources dans un fichier lrs
    Par SergioMaster dans le forum Lazarus
    Réponses: 3
    Dernier message: 09/10/2009, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo