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

Boost C++ Discussion :

boost::serialization et std::unique_ptr


Sujet :

Boost C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    836
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 836
    Par d�faut boost::serialization et std::unique_ptr
    Je cherchais un moyen de sauvegarder/charger des donn�es de mon projet, et je suis tomb� sur boost::serialization qui avait l'air pas mal sur le papier.
    Sur le papier, parce qu'il semble qu'il ne supporte pas les std::unique_ptr, et j'ai moyennement envie de faire passer tout mon projet aux pointeurs nus (quoique parfois j'h�site, vues les gal�res que les unique_ptr m'infligent...le souci c'est que je pr�f�re diminuer le risque de fuites m�moires, surtout si quelqu'un d�cide de contribuer...)...

    Vu que je n'ai jamais utilis� boost::serialization avant et que je doute franchement d'avoir tout compris par rapport � son usage, je me demande si ce n'est pas plut�t moi qui ai merd� quelque part. (A moins que le probl�me ne vienne d'une mauvaise utilisation de std::unique_ptr... �a ne m'�tonnerait pas outre mesure non plus.)

    Le probl�me viens du fait que le constructeur par copie est appel� par boost::interface_iarchive::operator>>(...) . J'aurai pu simplement lui passer un pointeur brut issu de mon unique_ptr, sauf que celui-ci est en fait poss�d� par un vector et qu'une telle op�ration impliquerais d'it�rer sur le vecteur, hors, j'ai cru comprendre que boost �tait capable de le faire lui-m�me.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void LoadTextFile::installEventManager(RenderWindow & target) throw()
    {
    	...
    	...
    	...
    	std::string filename(openFile.GetPath());
    	std::ifstream ifs(filename);
    	boost::archive::text_iarchive ia(ifs);
    	ia >> static_cast<Group&>(target);// génère l'erreur, bien qu'elle ne soit pas vraiment causée par cette ligne
    	//target  contiens un std::vector<std::unique_ptr<Object>> qui doit être sérializé et qui cause le problème
    }
    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
     
    ...
    #include <boost/serialization/vector.hpp>
    ...
     
    class Group : public Object
    {
    	...
    	...
    	...
    	private:
    		template<class Archive>
    		void serialize(Archive & ar, const unsigned int version)
    		{
    			ar & m_children;
    		}
     
    	public:
    	protected:
    		std::vector<std::unique_ptr<Object>> m_children;
    }
    Si quelqu'un � une id�e de comment r�soudre ce probl�me, je suis preneur... Ou m�me si quelqu'un me dis que boost en est incapable. Si c'est le cas, je ferais une solution "maison" m�me si je pr�f�re �viter de r�inventer la roue :/

  2. #2
    Membre �clair�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    836
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 836
    Par d�faut
    Hum, apr�s avoir fouill� un peu, il semble qu'il faille enregistrer les pointeurs (je l'avais lu, mais sans y faire attention... pourtant, c'est logique ).

    Du coup, j'ai ajout� le code que je suppose n�cessaire, ce qui donne donc:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	boost::archive::text_iarchive ia(ifs);
    	ia.register_type(static_cast<std::unique_ptr<Group>>(nullptr));
    	ia.register_type(static_cast<std::unique_ptr<RenderWindow>>(nullptr));
    	ia.register_type(static_cast<std::unique_ptr<Shape>>(nullptr));
    	boost::serialization::void_cast_register(static_cast<std::unique_ptr<Group>>(nullptr),static_cast<std::unique_ptr<Object>>(nullptr));
    	boost::serialization::void_cast_register(static_cast<std::unique_ptr<RenderWindow>>(nullptr),static_cast<std::unique_ptr<Object>>(nullptr));
    	boost::serialization::void_cast_register(static_cast<std::unique_ptr<Shape>>(nullptr),static_cast<std::unique_ptr<Object>>(nullptr));
    	ia >> static_cast<Group&>(target);
    Sauf que du coup, j'ai des erreurs compl�tement diff�rentes et pas sp�cialement tr�s claires (ah, les templates...)
    In member function 'virtual void LoadTextFile::installEventManager(RenderWindow&)':
    error: no matching function for call to �boost::archive::text_iarchive::register_type(std::unique_ptr<Group>)�
    note: candidate is:
    note: template<class T> const boost::archive::detail::basic_pointer_iserializer* boost::archive::detail::interface_iarchive::register_type(T*) [with T = T; Archive = boost::archive::text_iarchive]
    note: template argument deduction/substitution failed:
    note: mismatched types �T*� and �std::unique_ptr<Group>�|
    Conclusion, j'ai toujours l'impression que je vais en ch*** pour utiliser std::unique_ptr

  3. #3
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Je ne connais pas boost::serialization, mais dans la doc je vois ca :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    sa.register_type<T>() 
    sa.register_type(u)
    T is an Serializable Type
    u is a pointer to a an instance of type T
    A type T is Serializable if and only if one of the following is true:
    [...]
    It is a class type and one of the following has been declared according to the prototypes detailed below:
    a class member function serialize
    a global function serialize
    As-tu bien v�rifier l'ensemble de ces conditions ?

  4. #4
    Membre �clair�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    836
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 836
    Par d�faut
    Merci de ta r�ponse.
    J'ai bien ajout� les m�thodes "template<class Archive> void serialize(Archive & ar, const unsigned int version)" dans chaque classe qui n�cessite d'�tre s�rialis�e.

    Je pense que mon souci viens plus du souci indiqu� par cette ligne d'erreur : "mismatched types 'T*' and 'std::unique_ptr<Group>' ". Il est �vident qu'il ne s'agit pas des m�me types, puisque std::unique_ptr est une classe. Ok, elle agit (presque) comme un pointeur mais pas tout � fait, et de toute fa�on le compilo ne regarde mais ce que �a fait, mais ce que c'est.

    Pour tout ce qui concerne les collections, ils ont ajout� des headers correspondants. Par exemple pour les vector: "#include <boost/serialization/vector.hpp>". Il aurait fallu un �quivalent pour "#include <memory>" mais je n'en ai pas trouv� :S

    EDIT:
    A noter qu'il semble qu'il y ait ces headers pour shared_ptr, weak_ptr et scoped_ptr, sauf que bon, ce n'est pas ces pointeurs que j'ai utilis� (et pour cause, je n'utilise pas de pointeurs poss�d� par plusieurs personnes, et je ne sais m�me pas � quoi correspond scoped_ptr)

  5. #5
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Je vais essayer d'expliciter un peu plus :

    1/ As-tu v�rifier que std::unique_ptr<T> est serializable si T l'est ? Si ce n'est pas le cas (et je pense que ca ne l'est pas, mais � v�rifier tout de m�me, je ne connais pas boost::serializable), as-tu fais quelque chose pour rendre std::unique_ptr<T> serializable si T l'est ?

    2/ Dit autrement, as-tu �cris une fonction serialize propre � un/des std::unique_ptr (de mani�re g�n�rique peut-�tre ?) ? Si ce n'est pas le cas, alors � moins que boost le fasse par d�faut, std::unique_ptr n'a aucune raison d'�tre serializable.

    Suite � ton edit: Regardes la doc de boost::scoped_ptr, c'est comme std::unique_ptr la move semantic en moins.

  6. #6
    Membre �clair�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2008
    Messages
    836
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 836
    Par d�faut
    Hum, bien vu. Logiquement, unique_ptr<T> ne devrais pas �tre s�rialisable de la m�me fa�on qu'un objet classique. Et je doute qu'il soit possible qu'il expose une interface qui le rende s�rialisable, puisque le but n'est que d'imiter un pointeur.

    Donc, on dirait qu'il va falloir que je fouille le source de boost pour appliquer ce qu'ils ont fait aux pointeurs bruts sur un std::unique_ptr.

    Ca risque d'�tre p�nible, mais c'est une piste.

    Au cas o�, vu que je n'ai rien trouv� sur ce sujet sur le net, j'ai �galement envoy� un mail sur la ML utilisateurs. J'attends qu'il y ait une r�ponse avant de commencer � perdre du temps a tenter d'impl�menter quelque chose qui existe peut-�tre d�j�.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 6
    Dernier message: 31/08/2007, 21h05
  2. Boost::Serialize
    Par Rodrigue dans le forum Biblioth�ques
    R�ponses: 19
    Dernier message: 26/07/2007, 16h09
  3. Librairie boost::serialization + vector : possible ?
    Par zax-tfh dans le forum Biblioth�ques
    R�ponses: 6
    Dernier message: 07/01/2006, 14h15
  4. boost::serialize
    Par Fry dans le forum Biblioth�ques
    R�ponses: 6
    Dernier message: 05/11/2004, 18h03

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