Salut,

Je suis occupé à tester la sérialization avec boost sur des classes templates...

Je pars donc d'une classe du genre de
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
template <typename Value, int>
struct FARFELUE_API TPoint;
template <typename Value>
struct FARFELUE_API TPoint<Value, 2>
{
    typedef Value value_type;
    typedef TPoint<value_type, 2> point_type;
    TPoint()  = default;
    TPoint(value_type x, value_type y):x(x),y(y){}
    value_type x;
    value_type y;
};
 
template <typename Value>
struct FARFELUE_API TPoint<Value, 3>
{
    typedef Value value_type;
    typedef TPoint<value_type, 3> point_type;
    TPoint()  = default;
    TPoint(value_type x, value_type y, value_type z):x(x),y(y),z(z){}
    value_type x;
    value_type y;
    value_type z;
};
avec un code de sérialization non intrusif proche de
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
namespace boost
{
    namespace serialization
    {
        template<typename Archive, typename T>
        void serialize( Archive & ar, TPoint<T,2> & pt, 
                        const unsigned int version)
        {
            ar & BOOST_SERIALIZATION_NVP(pt.x)
               & BOOST_SERIALIZATION_NVP(pt.y);
        }
        template<typename Archive, typename T>
        void serialize( Archive & ar, TPoint<T,3> & pt, 
                     const unsigned int version)
        {
            ar & BOOST_SERIALIZATION_NVP(pt.x)
               & BOOST_SERIALIZATION_NVP(pt.y)
               & BOOST_SERIALIZATION_NVP(pt.z);
        }
    }
}
typedef boost::archive::text_oarchive output_file; /* (1) */
typedef boost::archive::text_iarchive output_file; /* (1) */
(1) Tant que je travaile avec des couples boost::archive::text_oarchive / boost::archive::text_iarchive ou boost::archive::binary_oarchive / boost::archive::binary_iarchive, sous réserve d'adapter les inclusion d'en-tete de boost::archive, un code proche de

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
void save(TPoint<int, 2> const & point)
{
    std::cout << "before save " <<std::endl
              <<point.x << " " << point.y<<std::endl;
    std::ofstream ofs("point.xml");
    assert(ofs.good());
    output_file of(ofs);
    of << point;
}
void load(TPoint<int, 2> & point)
{
    std::ifstream ifs("point.xml");
    assert(ifs.good());
    input_file ia(ifs);
    ia >> point;
    std::cout << "after reading " <<std::endl
              <<point.x << " " << point.y<<std::endl;
}
int main()
{
    TPoint<int , 2> point(0,4);
    save(point);
    TPoint<int , 2>  loaded;
    load(loaded);
    return 0;
}
compile et fonctionne parfaitement.

Par contre, dés que j'essaye de travailler avec des archive xml, j'obtiens l'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
..\..\boostMinGW\include\boost-1_47\boost\archive\basic_xml_iarchive.hpp||In member function 'void boost::archive::basic_xml_iarchive<Archive>::load_override(T&, int) [with T = TPoint<int, 2>, Archive = boost::archive::xml_iarchive]':|
..\..\boostMinGW\include\boost-1_47\boost\archive\xml_iarchive.hpp:93|9|instantiated from 'void boost::archive::xml_iarchive_impl<Archive>::load_override(T&, int) [with T = TPoint<int, 2>, Archive = boost::archive::xml_iarchive]'|
..\..\boostMinGW\include\boost-1_47\boost\archive\detail\interface_iarchive.hpp:60|9|instantiated from 'Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = TPoint<int, 2>, Archive = boost::archive::xml_iarchive]'|
C:\projects\farfelue\test\main.cpp:39|11|instantiated from here|
..\..\boostMinGW\include\boost-1_47\boost\archive\basic_xml_iarchive.hpp|70|error: no matching function for call to 'assertion_failed(mpl_::failed************ boost::serialization::is_wrapper<TPoint<int, 2> >::************)'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 1 seconds) ===|
et ce, uniquement si j'essaye de décommenter la fonction "load"...

Le plus bizard de l'histoire, c'est que, pour autant que le contenu de la fonction load soit commentée, la compilation s'effectue correctement (ca, c'est normal ) mais que le fichier généré par save semble être tout à fait correct...

  • Aurais-je raté quelque chose
  • Devrais-je veiller à créer une spécialisation de is_wrapper
  • Est-ce, simplement, un bug de boost