2013-05-30 4 views
0

Я хочу расширить библиотеку последовательной сортировки таким образом, чтобы коллекции STL сохранялись в XML-архивах в другом формате, чем тот, который предоставляется библиотекой Boost Serialization.Изменение сериализации контейнеров STL при использовании Boost.Serialization

Если я правильно все STL контейнеры проходят следующую функцию в процессе сериализации:

// <boost/serialization/collections_save_imp.hpp> 

namespace boost{ namespace serialization { namespace stl { 

template<class Archive, class Container> 
inline void save_collection(Archive & ar, const Container &s) 
{ 
    /* ... */ 
} 

} } } 

Так что я попытался перегружать эту функцию для xml_oarchive. Вот небольшой пример моего подхода:

#include <iostream> 
#include <vector> 

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/serialization/vector.hpp> 

namespace boost { namespace serialization { namespace stl { 

template< typename Container > 
inline void save_collection(boost::archive::xml_oarchive& ar, Container const& s) 
{ 
    /* My serialization */ 
} 

} } } 

int main() 
{ 
    { 
    boost::archive::xml_oarchive ar(std::cout); 

    std::vector<int> x; 

    x.push_back(-1); 
    x.push_back( 1); 
    x.push_back(42); 
    x.push_back( 0); 

    ar << BOOST_SERIALIZATION_NVP(x); 
    } 

    return 0; 
} 

Он компилируется и запускается. Но он не вызывает мою функцию, но тот, который предоставляется Boost. Что мне нужно сделать/изменить, чтобы моя сериализация контейнеров STL работала?

+0

Код внутри Boost, включает в себя не видит ваш перегруженной функции. –

ответ

0

Наконец я пришел к этому решению моей проблемы:

#include <iostream> 
#include <vector> 

namespace boost { namespace archive { class xml_oarchive; } } 

namespace boost { namespace serialization { namespace stl { 


    /* Two template parameters are needed here because at the caller side 
    * a function with two template parameters is explicitly requested. */ 
    template< typename, typename Container > 
    void save_collection(boost::archive::xml_oarchive&, Container const&) 
    { 
     /* ... */ 
    } 

} } } 
/* Note that this is before the boost includes. */ 

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/serialization/vector.hpp> 


int main() 
{ 
    { 
    boost::archive::xml_oarchive ar(std::cout); 

    std::vector<int> x; 

    x.push_back(-1); 
    x.push_back( 1); 
    x.push_back(42); 
    x.push_back( 0); 

    ar << BOOST_SERIALIZATION_NVP(x); 
    } 

    return 0; 
} 
Смежные вопросы