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 :/