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

VC++ .NET Discussion :

[Débutant] Méthodes de sérialisation


Sujet :

VC++ .NET

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut [Débutant] Méthodes de sérialisation
    Bonjour,

    J'aimerais savoir qu'elle serait la meilleure des méthodes de sérialisation utilisable dans un projet c++ .net. Je ne vois pas trop comment faire après tout ce que j'ai lu dans les tutos du forum.

    J'aimerais sérialiser des informations de types textes et position (exemple la postion d'une fenêtre).

    N'y aurait-il pas une méthode de sérialisation descendant de system::form?

    Merci d'avance


  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu peux utiliser la sérialisation XML, il y a un petit exemple ici http://nico-pyright.developpez.com/t...rialisationXml

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Après ma mauvaise expérience de la sérialisation XML, je conseillerais plutôt la sérialisation classique.

    La sérialisation XML, basée sur la réflexion et ne prenant en compte que les membres publics accessibles en lecture et en écriture, ne marche vraiment bien qu'avec de bêtes structures POD...

    Et puis, impossible de transformer en attribut un objet, même si celui-ci se sérialise en une toute petite chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    Merci de vos indications.

    Auriez-vous des liens vers des tutoriels concernant la sérialisation classique avec les winForms ?

    Merci.

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Tout dépend de ton utilisation, mais je pense que la sérialisation XML est à étudier en priorité.
    Avec une sérialisation binaire, tu te restreins à ton application.
    La sérialisation XML est ouverte, compréhensible à l'oeil nu, standardisée et permet la communication de manière très aisée. Tu as aussi un controle accentué sur tes données (savoir quelles données à encoder en element ou attributs, changer le nom des éléments, ...). Et un point qui n'est pas des moindres, a mettre en place, c'est TELLEMENT plus facile.

    Ce n'est pas pour rien que .Net pousse par là, et que les autres librairies, comme boost pour ne citer qu'elle, s'y sont mises aussi.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    D'accord, mais la sérialisation XML avec des winforms est-ce jouable?

    Il n'existe pas d'exemples sur lesquels je pourrais m'appuyer?

    Merci

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    l'exemple que je t'ai montré est un exemple de sérialisation XML. Ok, cela se fait dans un programme MFC, mais le principe est le meme.
    Il suffit d'avoir une class ref publique, de la faire connaitre pour sérialisation avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [System::Xml::Serialization::XmlInclude(MaClasse::typeid)]
    et de lancer la sérialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    System::Xml::Serialization::XmlSerializer ^ sr;
    	sr = gcnew System::Xml::Serialization::XmlSerializer(MaClasse::typeid);
    	System::IO::StreamWriter ^ writer = gcnew System::IO::StreamWriter("fichier.xml");
    	try
    	{
    		sr->Serialize(writer, monObjetASerialiser);
    	}
    un truc du genre

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    Est-ce qu'il est possible de tout sérialiser en une seule fonction. En fait, j'ai une apllication qui lance une fenetre principale qui en cliquant dessus génère d'autres fenêtres et je voudrais en fermant l'application tout sérialiser, c'est-à-dire enregistrer toutes les positions des fenêtres générées par l'application. Et quand je redémarre l'application, il faudrait que tout ce qui a été créé réapparaissent à sa position lors de la fermeture de l'application.

    Je débute en Visual C++ et je me galère pas mal, je suis désolé de vous poser ce genre de question.

    Merci.

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    bien sur que c'est possible, il suffit de créer un objet qui contient toutes les valeurs dont tu as besoin
    cela peut etre un objet qui contient d'autres objet ... du moment que toutes les classes sont déclarées sérialisables

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    J'ai un bug sur la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sr = gcnew System::Xml::Serialization::XmlSerializer(MaClasse::typeid);
    J'ai une erreur, on me dit de gérer la propriété innerException, comment je peuxrésoudre cela?

    Merci

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu as bien un truc du genre au dessus de ta classe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [System::Xml::Serialization::XmlInclude(MaClasse::typeid)]
    elle est bien public ?

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    [System::Xml::Serialization::XmlInclude(Form1::typeid)]
     
    public ref class Form1 : public System::Windows::Forms::Form
    {
    Voilà ce que j'ai.

  13. #13
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    si tu traites l'exception, il te met quoi comme message ?

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    Bin ca me bug sur la ligne précédement citée;

    Ca me dit que l'exception InvalidOperationException n'a pas été gérée.

    Alors quand je traite l'exception,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
    {
    sr = gcnew System::Xml::Serialization::XmlSerializer(Form1::typeid);
    }
    catch (Exception ^ e)
    {
    System::String ^ message = 	e->InnerException->Message->ToString();
    this->label1->Text="" + message;
    }
    alors le message c'est : " la référence d'objet n'est pas définie à une instance d'un objet".

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    t'as un petit projet simple qui reproduit l'erreur ?

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    Je joins là mon form1.h?

    Je n'ai rien changé dans les autres classes.
    Fichiers attachés Fichiers attachés

  17. #17
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    j'ai bien compris, tu veux sérialiser ta form complète ?
    ca ne me parait pas judicieux ... plutot faire un objet dédié qui contiendrait les objets et valeur dont tu as besoin

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    J'ai créé une petite classe juste pour tester la sérialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [System::Xml::Serialization::XmlInclude(FenP::typeid)]
     
    	public ref class FenP
    	{
    	public:
    		System::Int16 x;
    		System::Int16 y;
    		FenP(void);
    	};
    La sérialisation fonctionne.

    J'ai mis dans les valeurs x et y des valeurs du forme. Et elle sont inscites dans le fichier XMl.

    En ce qui concerne la désérilaisation, j'ai un peu de mal à comprendre l'exemple et je voulais savoir vu qu'on déserialise, il faut modifer le constructeur. Comme je sérialise ma classe FenP qui comporte des infos sur Form1, il faut que je réécrive le constructeur de Form1 nan?

    Merci.

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Non non, avec la sérialisation XML, tu n'as pas de constructeur de désérialisation.
    C'est pourquoi les données sérialisées doivent être disponibles de l'extérieur en lecture et en écriture.
    Par conséquent, un objet immuable (à part les strings) n'est pas sérialisable en XML.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #20
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 65
    Par défaut
    Admettons que je sérialise la taille de la fenêtre de la classe Form1 (2 variable width et height), comment je peut faire en sorte que lorsque je redémarre j'informe la Form1 de ces dimensions? Si j'ai sérialisé les valeurs width = 530 et height = 400, comment je fais pour que rédemarrage quand je fais gcnew Form1(), ça me crée une fenetre de dimension 530 * 400?

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. débutant XMLEncoder soucis sérialisation classes
    Par superpigeon dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 26/10/2006, 14h24
  2. [EJB] [débutant] [Méthode]EJB et présentation web
    Par Eric Berger dans le forum Java EE
    Réponses: 6
    Dernier message: 03/08/2006, 23h42
  3. [algoritmique][débutant]Méthode récursive
    Par lejimi dans le forum Langage
    Réponses: 7
    Dernier message: 16/01/2006, 19h54
  4. Réponses: 2
    Dernier message: 05/01/2006, 14h17
  5. [Débutant] Méthode super()
    Par KooX dans le forum Langage
    Réponses: 3
    Dernier message: 07/11/2004, 21h28

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