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]Sérialisation de CArray< >


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par défaut [MFC]Sérialisation de CArray< >
    Bonjour à tous,

    J'aimerai pouvoir sérialiser une classe CClass1 qui contient, entre autre un tableau m_tabClass2, variable membre qui est une CArray <CClass2*,CClass2*>, template CArray qui contient des pointeurs vers des objets CClass2.
    CClass2 est une classe dérivée de CObject.

    Dans la méthode Serialize (CArchive) de CClass1, j'ai donc écrit :
    m_tabClass2.Serialize(ar) et j'espère ainsi appeler la méthode CClass2::Serialize(CArchive ar). Or cela ne marche pas et je ne sais pas pourquoi...

    si j'ai un tableau CObArray m_tabObject et que je fais m_tabObject.serialize(ar) dans le serialize de CClass1, la méthode de serialisation de l'object stocké ds le CObArray est pourtant bien appelé...

    Une solution que j'ai trouvé est donc de caster mes objets CClass2 en CObject (puisque CClass2 dérive de Cobject), de les stocker dans un tableau CObArray, et d'appeler la méthode de sérialisation sur ce tableau.. vous avouerez que ce n'est pas très très propre...

    Ensuite, deuxième problème, dans cette clase CClas1, j'ai également un autre tableau m_tabPoint, de type CArray<CPoint*,CPoint*>. Ma solution précédemment évoqué tombe malheureusement à l'eau car CPoint ne dérive pas de CObject...

    Ma question est donc la suivante : comment sérialiser un objet de type CArray<myClass1*,myClass1*> où myClass1 est dérivée de Cobject ou non (comme CPoint par exemple...)

    Merci d'avance pour votre aide!!

  2. #2
    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

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par défaut
    Salut,

    Malheureusement, je n'arrive pas à faire marcher ma sérialisation, même après avoir lu la FAQ...

    J'ai une classe CClass1 avec un tableau CArray<CClass2,CClass2&>
    Dans ma méthode Serialize de CClass1, j'ai donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_tabClass2.Serialize(ar);
    En debuggant, je constate que cela m'appelle cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class TYPE, class ARG_TYPE>
    void CArray<TYPE, ARG_TYPE>::Serialize(CArchive& ar)
    qui est dans AFXTEMPL.H

    et dans cette méthode, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SerializeElements<TYPE>(ar, m_pData, m_nSize);
    Or cela appelle ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class TYPE> void AFXAPI SerializeElements(CArchive& ar, TYPE* pElements, int nCount)
    toujours dans afxtempl.h
    et non pas MON serializeElements que j'ai écrit, comme c'est marqué dans la FAQ :

    // Source.........................
    //---------------------------------------------------------------------------------------
    // definition de la methode de serialisation de l'objet CItem pour le template CArray.
    template <> static void AFXAPI SerializeElements <CItem> ( CArchive& ar,
    CItem* pItem, int nCount )
    {
    for ( int i = 0; i < nCount; i++, pItem++ )
    pItem->Serialize( ar );
    }

    Je ne vois vraiment pas pourquoi ma méthode de sérialisation pr l'objet CItem n'est pas utilisée...help pliz...

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    peux-tu donner ton code ?
    - le code de la classe CClass1 (épuré, c'est-à-dire juste la déclaration de la classe et l'implémentation de Serialize)
    - le code où tu places la méthode SerializeElement
    - le code où tu serialises un CClass1


  5. #5
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par défaut
    Voilà :

    le code de la classe CClass1
    CClass1.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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #define TAILLEMAT 30
    class CClass1 : public CObject   
    {
     
    	DECLARE_SERIAL (CClass1)
     
    public:
    	void setTrucMuche1();
     
    	CClass1();
    	virtual ~CClass1();
     
    	[b]CArray<CClass2,CClass2&> m_tabClass2;[/b]
     
    	bool m_tab1[TAILLEMAT][TAILLEMAT];
    	int m_tab2[TAILLEMAT][TAILLEMAT];
    	double m_tab3[TAILLEMAT][TAILLEMAT];
     
    	void	Serialize(CArchive &ar);
     
           /*
           ->ici, non recopié, des méthodes de la classe
    	                           des "getteurs" et "setteurs" pour les variables privées
          */
     
    private:
    	//déclarations des variables privées, non recopié ici
    };
    - le code où tu places la méthode SerializeElement
    CClass2.Cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <> static void AFXAPI SerializeElements <CClass2> (CArchive& ar, CClass2* pItem, int nCount )
    {
    	for ( int i = 0; i < nCount; i++, pItem++ )            
        pItem->Serialize( ar );    
    }
     
    IMPLEMENT_SERIAL ( CClass2,CObject,1)

    - le code où tu serialises un CClass1
    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
    void CClass1::Serialize(CArchive &ar)
    {
     
    	CObject::Serialize(ar);
     
    	if (ar.IsStoring())
    	{
    		ar << mes variables qui acceptent l'opérateur (int,CString,...)
    	}
    	else
    	{
    		ar>> mes variables qui acceptent l'opérateur (int, CString...)
     
    	}
     
    [b]m_tabClass2.Serialize(ar);[/b]
    }
    et cette méthode est appelée dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void CConceptionPdFDoc::Serialize(CArchive& ar)
    {
     
    	pclass1->Serialize(ar);
     
    }
    où pclass1 est un pointeur vers un objet CClass1.


    Voilà, en espérant que cela puisse vous aider à m'aider!
    En tout cas, merci d'avance!

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par TigreRouge
    CClass2.Cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <> static void AFXAPI SerializeElements <CClass2> (CArchive& ar, CClass2* pItem, int nCount )
    {
    	for ( int i = 0; i < nCount; i++, pItem++ )            
        pItem->Serialize( ar );    
    }
    ce n'est pas dans class2.cpp qu'il faut mettre ce bout de code, mais dans class1.cpp. c'est class1 qui a besoin de savoir comment gérer la serialisation d'un CArray<class2,class2&>.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 79
    Par défaut
    Merci beaucoup, effectivement ca marche mieux maintenant apparemment!

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

Discussions similaires

  1. [MFC] Carray de CStringList
    Par r0d dans le forum MFC
    Réponses: 8
    Dernier message: 15/12/2005, 11h22
  2. [MFC] CArray et classe dérivée?
    Par TigreRouge dans le forum MFC
    Réponses: 14
    Dernier message: 02/08/2005, 22h45
  3. [MFC] CArray dans Copyfrom
    Par Gloubi99 dans le forum MFC
    Réponses: 5
    Dernier message: 22/07/2005, 10h11
  4. [Debutant][MFC]CArray
    Par gwendo dans le forum MFC
    Réponses: 3
    Dernier message: 23/03/2005, 17h22
  5. [Débutant][MFC] CArray
    Par gwendo dans le forum MFC
    Réponses: 2
    Dernier message: 21/03/2005, 10h00

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