[boost::serialization XML] problèmes de désserialisation
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:aie:
j'utilise MSVC++ 2005 et boost 1.39 le tout sur Windows 7
voici ma méthode de desserialisation:
Code:
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:
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:
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:mrgreen:
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.