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

MFC Discussion :

[MFC] Serialisation


Sujet :

MFC

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut [MFC] Serialisation
    Bonjour

    Apres �pluchage du tuto de Farscape et de la FAQ, j'ai, apres une bataille acharn�e r�ussi � fabriquer mon archive.

    En ouvrant mon archive avec le bloc note, il n'y a que des signes bizarres contrairement � celle du prog li� au tuto. bizarre ...... est ce normal ???


    Ne pouvant v�rifier le contenu de mon archive comme �a, j'ai ajout� ds le menu un commande bibon qui renvoi sur une fonction (ci jointe) dans laquelle je :
    - serialise mon CArray
    - vide le Carray
    - d�serialise dans le meme CArray.

    Normalement si tout se passe bien, le prog continu de fonctionner. ce qui est le cas

    j'ai alors d�plac� la "deserialisation" dans CAngelView::OnInitialUpdate()
    et l� BOUM !!!!!!!!!

    A la fin de l'iinitialupdate, il retouve bien le meme nombre d'�l�ment contenu ds l'archive mais une simple boucle pour v�rifier le contenu � la fin de l'initialisation fait tout exploser !!! (la boucle fonctionnait tres bien avant dans la fct)

    une petite du probl�me :
    d'avance

    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
     
    void CAngelView::OnChargerSerialiser()
    {
    CAngelApp *pTheApp=static_cast<CAngelApp *>(AfxGetApp()); 
     
     // archivage.
              CFile File;    
            if(File.Open("MyArchive.zac", File::modeCreate|CFile::modeWrite ))
            {
                CArchive ar( &File, CArchive::store);
                pTheApp->mesabsences.Serialize(ar);
            }
    // on vide
     
    pTheApp->mespunitions.RemoveAll();
     
    //Lecture de l'archive.
     
        CFile File;    
        if(File.Open("MyArchive.zac", CFile::modeRead ))
       {
           CArchive ar( &File, CArchive::load);
           pTheApp->mesabsences.Serialize(ar);
       }
    }

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    erreur de frappe suite � mes nombreux tests

    dans la fct il faut lire

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // on vide 
     
    pTheApp->mesabsences.RemoveAll();
    [/quote]

  3. #3
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    pour les signes bizarres c''est normal ,une serialisation ne produit pas un fichier ascii lisible.
    la serialisation sauvegarde aussi des informations li�es a la signature des classes.
    les tailles des zones etc...
    donc il ne faut pas faire notepad dessus...
    pour ton probleme �a plante ou exactement ?
    le code montr� me semble correcte .

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Salut Farscape

    avec la fct ci-dessus tout marche ... enfin presque

    si je fais des boucles de MessageBox avec .GetStrDump avant, au milieu et apres c'est bon. Je peux r�utiliser mes donn�es dans le reste du prog. Mais quand je ferme le prog il me genere une erreur sur "Atlsimpstr.h" !!!!!!!!!!!!
    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
    	void Release() throw()
    	{
    		ATLASSERT( nRefs != 0 );
     
    		if( _InterlockedDecrement( &nRefs ) <= 0 )
    		{
    			pStringMgr->Free( this );               //<<--------erreur ici à l'arret----------
    		}
    	}
    	void Unlock() throw()
    	{
    		ATLASSERT( IsLocked() );
     
    		if(IsLocked())
    		{
    			nRefs++;  // Locked buffers can't be shared, so no interlocked operation necessary
    			if( nRefs == 0 )
    			{
    				nRefs = 1;
    Le but �tant que le prog recharge l'archive tout seul au d�marrage, j'ai d�plac� la partie chargement de l'archive dans CAngelView::OnInitialUpdate

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    CAngelApp *pTheApp=static_cast<CAngelApp *>(AfxGetApp()); 
     CFile File;    
        if(File.Open("MyArchive.zac", CFile::modeRead ))
       {
           CArchive ar( &File, CArchive::load);
           pTheApp->mesabsences.Serialize(ar);
       }
    si juste apr�s l'initialisation, je verifie le contenu de "mesabsences"
    il trouve le bon nombre d'article
    GROS plantage au premier MessageBox avec .GetStrDump

    : ce que je ne comprends pas, c'est qu'il y a quelque chose dans l'archive car elle est pas vide, mais c'est pas le bon truc apparemment.
    il genere une erreur dans "memcpy.asm"

    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
     
            std                     ;N - set direction flag
            rep     movsd           ;N - move all of our dwords
            cld                     ;N - clear direction flag
     
            jmp     dword ptr TrailDownVec[edx*4] ;N - process trailing bytes
     
            align   @WordSize
    LeadDown2:
            mov     al,[esi+3]      ;U - load first byte             <<----------- erreur ici 
            and     edx,ecx         ;V - trailing byte count
     
            mov     [edi+3],al      ;U - write out first byte
            mov     al,[esi+2]      ;V - get second byte from source
     
            shr     ecx,2           ;U - shift down to dword count
            mov     [edi+2],al      ;V - write second byte to destination

  5. #5
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    tu dois avoir quelque chose de pas clair dans ta serialisation.
    en gros �a sent le debordement m�moire .
    pour l'erreur sur le memcpy.asm il faudrait remonter la pile des appels pour voir a quel partie de ton code �a correspond .

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Citation Envoy� par farscape
    il faudrait remonter la pile des appels pour voir a quel partie de ton code �a correspond .
    : K�sako cette b�te l� :

  7. #7
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    voir page 90 de mon tuto sur le debuggage et plus exactement page 91

  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Merci pour le tuyau....

    j'avais saut� le paragraphe car je comprenais pas grand chose au code dans les fenetres.

    le couteau sous la gorge , je m'y replonge car manifestement c'est un truc � savoir faire.

    Bonne nuit.

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut Suite de l'histoire...........
    Bonjour,

    Le debuggeur et moi, on est devenu grand copain !!! enfin presque ...



    2�me ligne (en partant du haut) erreur dans atlsimpstr.h pas mon prog !
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    ~CSimpleStringT() throw()
    	{
    		CStringData* pData = GetData();
    		pData->Release();      <<-----ici-
    3eme ligne erreur dans cstringt.h pas mon prog ! encore !!!
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    // Destructor
    	~CStringT() throw()         <<------ici-
    4eme ligne erreur dans eleve.h enfin mon prog
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
       CEleve(){Clear();}
        //-----------------------------
        ~CEleve(){}   <<----ici-
    Ma Conclusion :
    l'erreur est g�n�r�e suite de l'appui sur la touche exit du prog et non dans la boucle comme je pensais.
    il ne semble pas bien dig�rer la destruction du CArray de Celeve

    Ce que je ne comprends pas :
    la destruction de ce CArray ne posait pas de probleme jusqu'� pr�sent.
    En quoi la s�rialisation/des�rialisation d'un CArray de Cabsence (donc d'une classe que n'a rien � voir) empeche la destruction ?
    j'ai essay� pour voir de s�rialiser/des�rialiser un CArray de Cclasse � la place. meme plantage, mais pile legerement diff�rente il bloque au destructeur de Cclasse.

    c'est vraiment l'acte de d�s�rialiser qui fait le plantage final.

    une ou des pour que je reprenne le

  10. #10
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    �a c'est c'est une belle pile d'appels
    bien c'est donc sur la destruction de ton CArray<CEleve> qu'il y a un probleme.
    apparemment �a touche a la classe CString .
    tu pertubes la memoire dans un de tes traitements.

    il faudrait voir dans un premier temps la definition/implementation de la classe CEleve.

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Salut Farscape

    pour la classe, je l'ai copi� coll� de celle propos�e dans la FAQ en la modifiant selon mes besoins.

    une question b�te mais c'est peut etre �a le probl�me car apres relecture papier et comparaison, je vois que ca.

    ca pose un probl�me si dans la classe on a par exemple 15 variables (3 CString, 1 bool et 11 int) et que dans la partie void Serialize(CArchive& ar) on n'est pas interress� par tout garder (le 11eme int se calculant � partir des 10 autres int) et que l'on en s�rialise donc que 14 ????

    Est ce que ca lui fait perdre son latin ?

  12. #12
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    la serialisation doit etre symetrique
    ce qui est archiv� dans un ordre doit etre lu dans le meme ordre
    si c'est pas le cas tu t'exposes a des debordements memoires...

  13. #13
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Elle est sym�trique pour toutes mes classes dans le sens o� c'est dans le meme ordre mais toutes les variables de la classe ne sont pas serialis�es pour Celeve.

    Si on peut serialiser qu'une partie de la classe, alors c'est pas �a l'erreur.

    Ca ne pose pas de probleme d'avoir saposi � la fin ??
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Serialize(CArchive& ar)
        {
            if(ar.IsStoring())
                ar << sonnom << sonprenom  << saclasse << songrptp << sonoubli << sonretard << soncgum  << saremneg << samap << sonclasseursalle << sonoral << sonexo; 
            else
                ar >> sonnom >> sonprenom >> saclasse >>songrptp >> sonoubli >> sonretard >> soncgum  >> saremneg >> samap >> sonclasseursalle >> sonoral >> sonexo; 
     
    		saposi.Serialize(ar);   //CArray de int
    }

  14. #14
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    ce que tu me montre est correcte.
    la derniere instruction gere le sens archivage/lecture.

    Si on peut serialiser qu'une partie de la classe, alors c'est pas �a l'erreur.
    oui mais ou �a ?
    si il y a erreur ce n'est pas dans cette portion de code.

  15. #15
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    j'ai pas l'impression que tu as compris ma question. Je reformule simplement avec un exemple bidon.

    Dans une class Cbibon j'ai 3 CString (bidon1, 2, 3)
    ai je le droit de d�clarer dans ma classe la fct comme �a ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    void Serialize(CArchive& ar) 
        { 
            if(ar.IsStoring()) 
                ar << bidon1 << bidon2  ;   //pas de bidon3 <<< -------------
            else 
                ar >> bidon1 >> bidon2 ;    //pas de bidon3 <<< -------------
    ------------------------------------------------------------------------------------------------------------------
    la derniere instruction gere le sens archivage/lecture.
    quelle est la DERNIERE instruction pour toi
    1 saposi.Serialize(ar); //CArray de int
    OU
    2 ar >> sonnom >> sonprenom >> ...........

    : Si c'est 1 et que �a ne g�re que l'archivage/lecture quand est ce que c'est archiv�/�crit ??????
    Dans ce cas, il tente de lire un truc qu'il n'a pas �crit.


    Bonne nuit les petits .

  16. #16
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut,
    la derniere instruction c'est :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    saposi.Serialize(ar);
    et serialize fonctionne en lecture et ecriture ,c'est l'archive ar qui gere son mode de fonctionnement .
    tu as le droit d'enregistrer 2 cstring sur 3 et de relire 2 CString sur 3.
    mais ton probleme initial c'est sur la destruction d'un objet conteneur CArray
    en rapport avec la classe CEleve.
    la portion de code montr�e correspond au conteneur et a la classe CEleve ?

  17. #17
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Salut Farscape

    Merci pour la pr�cision.
    j'ai essay� de r�introduire mes classes une par une dans un autre programme bidon. Aucune de mes classes ne se d�serialise correctement en fait.

    Je cherche le probleme et je te tiens au courant quand j'ai la soluce.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 15/03/2006, 18h48
  2. [MFC] Serialisation et polymorphisme
    Par fmarot dans le forum MFC
    R�ponses: 3
    Dernier message: 06/03/2006, 12h44
  3. R�ponses: 1
    Dernier message: 15/12/2005, 09h45
  4. [MFC] serialisation (encore ...)
    Par Gloubi99 dans le forum MFC
    R�ponses: 4
    Dernier message: 15/09/2005, 11h53

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