boost serialization polymorphic
От: Аноним  
Дата: 20.04.11 06:10
Оценка:
Ищу рабочий пример сериализации полиморфных структур с помощью буста.
Данный код не работает: сериализуется только базовый класс. Где ошибка?

#include <string>
#include <fstream>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/export.hpp>

struct base {
  int x;

  template<class Archive>
  inline void serialize(
      Archive & ar,const unsigned int file_version
  ){
    ar & BOOST_SERIALIZATION_NVP(x);
  }
};

BOOST_SERIALIZATION_ASSUME_ABSTRACT(base)

struct derived_one : public base {
  std::string y;

  template<class Archive>
  inline void serialize(
      Archive & ar, const unsigned int file_version
  ){
        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);
//    boost::serialization::void_cast_register(
//        static_cast<derived_one *>(NULL),
//        static_cast<base *>(NULL)
//    );

    ar & BOOST_SERIALIZATION_NVP(y);
  }
};

BOOST_CLASS_EXPORT(base);

struct derived_two : public base {

  std::string z;

  derived_two():
    z("two")
  {
  }

  template<class Archive>
  inline void serialize(
      Archive & ar, const unsigned int file_version
  ){
//    boost::serialization::void_cast_register(
//        static_cast<derived_two *>(NULL),
//        static_cast<base *>(NULL)
//    );

//    boost::serialization::base_object<base>(*this);
        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base);

        ar & BOOST_SERIALIZATION_NVP(z);
  }
};

BOOST_CLASS_EXPORT(derived_one);
BOOST_CLASS_EXPORT(derived_two);

int main()
{
    std::ofstream of("test.xml");
    boost::archive::xml_oarchive archive(of);

    archive.register_type<derived_two>();

    base* b = new derived_two();

    archive << BOOST_SERIALIZATION_NVP(b);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.