Boujours tout le monde.
J'ai décidé d'utiliser boost::serialization XML pour enregistrer et sauvegarder les données de mon moteur 3D en C++ (pour voir ce que ça donne, une démo est ici en dernière page : http://www.developpez.net/forums/d72...rain-clipmaps/)

Pour serialiser mes objets en XML pas de problème. J'ai suivie le tuto de dev eloppez à la lettre.
C'est pour desserialiser que ça se corse:

Suivant l'ordre des commandes d'enregistrement des cast possibles et des classe fille soit mon programme plante au moment du cast de mon pointeur soit j'ai une erreur de compilation

j'utilise MSVC++ 2005 et boost 1.39 le tout sur Windows 7
voici ma méthode de desserialisation:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
void CChargeurDataXML::Charger(std::string i_strNom, boost::shared_ptr<CDataXML> & o_DataXML)
{
    std::ifstream ifileXML(i_strNom.c_str());
    try 
    {
        boost::archive::xml_iarchive iTextArchiveXML(ifileXML);
	    // inscription dans les tables Boost: CDataXML est la classe de base
        // camera hérite de CDataML
	    iTextArchiveXML.register_type(static_cast<CCameraXML *>(NULL));
        boost::serialization::void_cast_register(static_cast<CCameraXML *>(NULL),static_cast<CDataXML *>(NULL));  
        // lumiere hérite de CDataML
	    iTextArchiveXML.register_type(static_cast<CLumiereXML *>(NULL));
	    boost::serialization::void_cast_register(static_cast<CLumiereXML *>(NULL),static_cast<CDataXML *>(NULL)); 
        // shader hérite de CDataML
	    iTextArchiveXML.register_type(static_cast<CShaderXML *>(NULL));
	    boost::serialization::void_cast_register(static_cast<CShaderXML *>(NULL),static_cast<CDataXML *>(NULL));
        // scene info hérite de CDataML
	    iTextArchiveXML.register_type(static_cast<CSceneInfoXML *>(NULL));
        boost::serialization::void_cast_register(static_cast<CSceneInfoXML *>(NULL),static_cast<CDataXML *>(NULL)); 
        // CMediaXML hérite de CDataML, les CMediaTextureXML et autres héritent de CMediaXML
	    iTextArchiveXML.register_type(static_cast<CMediaXML *>(NULL));
        boost::serialization::void_cast_register(static_cast<CMediaXML *>(NULL),static_cast<CDataXML *>(NULL)); 
 
	    iTextArchiveXML.register_type(static_cast<CMediaTextureXML *>(NULL));
	    boost::serialization::void_cast_register(static_cast<CMediaTextureXML *>(NULL),static_cast<CMediaXML *>(NULL)); 
    boost::serialization::void_cast_register(static_cast<CMediaTextureXML *>(NULL),static_cast<CDataXML *>(NULL)); 
	    iTextArchiveXML.register_type(static_cast<CMediaTextureArrayXML *>(NULL));
   boost::serialization::void_cast_register(static_cast<CMediaTextureArrayXML *>(NULL),static_cast<CMediaXML *>(NULL)); 
	    boost::serialization::void_cast_register(static_cast<CMediaTextureArrayXML *>(NULL),static_cast<CDataXML *>(NULL)); 
	    iTextArchiveXML.register_type(static_cast<CMediaCubeMapXML *>(NULL));
	    boost::serialization::void_cast_register(static_cast<CMediaCubeMapXML *>(NULL),static_cast<CMediaXML *>(NULL)); 
	    boost::serialization::void_cast_register(static_cast<CMediaCubeMapXML *>(NULL),static_cast<CDataXML *>(NULL)); 
 
        CDataXML * l_pData = o_DataXML.get();
        iTextArchiveXML >> BOOST_SERIALIZATION_NVP(l_pData);     // déssérialisation
        o_DataXML = boost::shared_ptr<CDataXML>(l_pData);
    }
    catch(boost::archive::archive_exception & e)
    {
        std::cout << e.what();
    }
    ifileXML.close();
}
Le code ci dessus ne compile pas, erreur ci desous.
EN enlevant les média ca compile mais ca plante à l'éxecution à cett endroit dans iserializer.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
    static void invoke(Archive & ar, Tptr & t){
        const basic_pointer_iserializer * bpis_ptr = register_type(ar, *t);
        const basic_pointer_iserializer * newbpis_ptr = ar.load_pointer(
            * reinterpret_cast<void **>(&t),
            bpis_ptr,
            archive_pointer_iserializer<Archive>::find
        );
        // if the pointer isn't that of the base class
        if(newbpis_ptr != bpis_ptr){
            t = pointer_tweak(newbpis_ptr->get_eti(), t, *t);
        }
    }
la méchante erreur de compilation:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Erreur	3	error C2664: 'boost::archive::load_wrapper'*: impossible de convertir le paramètre 3 de 'boost::serialization::is_wrapper<T>' en 'boost::mpl::true_'	C:\COTS\boost_1_39\boost\archive\detail\iserializer.hpp	560
Je n'ai pas mit tout le code: 2000 lignes ça fait beaucoup

Pour résumer la serialisation marche parfaitement, c'est pour desserialiser que j'ai n'importe quoi. Un détail à du m'échapper mais je ne sais pas quoi.
merci pour votre aide.