2016-07-02 9 views
0

Я пытаюсь узнать, как использовать boost :: serialization для записи объекта. Например, я использую следующие коды для сериализации объекта:Как указать оболочку nvp для boost :: serialization?

struct Abc 
{ 
    int a; 
    float b; 
    double c; 
}; 

namespace boost 
{ 
    namespace serialization 
    { 
     template <typename Archive> 
     void serialize(Archive& ar, Abc &obj,const unsigned int version) 
     { 
      ar & BOOST_SERIALIZATION_NVP(obj.a); 
      ar & BOOST_SERIALIZATION_NVP(obj.b); 
      ar & BOOST_SERIALIZATION_NVP(obj.c); 
     }; 

    } 
}; 

    Abc kkk; 

    std::ofstream ofs(tmpFile); 

    boost::archive::xml_oarchive ar(ofs); 

    ar & kkk; 
    ofs.close(); 

Однако, когда я компилирую коды, у меня есть следующее сообщение об ошибке компиляции:

Error 1 error C2664: 'boost::mpl::assertion_failed' : cannot convert parameter 1 from 'boost::mpl::failed ************boost::serialization::is_wrapper<T>::* ***********' to 'boost::mpl::assert<false>::type' \boost_1_50_0\boost\archive\basic_xml_oarchive.hpp 92 

Сообщение об ошибке приводит к источнику код повышения:

template<class T> 
    void save_override(T & t, BOOST_PFTO int) 
    { 
     // If your program fails to compile here, its most likely due to 
     // not specifying an nvp wrapper around the variable to 
     // be serialized. 
     BOOST_MPL_ASSERT((serialization::is_wrapper<T>)); 
     this->detail_common_oarchive::save_override(t, 0); 
    } 

Любые идеи? Благодарю.

ответ

3

Вы должны сделать свой kkk экземпляр Abc в вашем коде на дне НВП, тоже:

ar & BOOST_SERIALIZATION_NVP(kkk); 

Все, это сериализованная в архив XML должен быть построен таким образом, а не только подэлементы ,