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);
}
Re: boost serialization polymorphic
От: Abyx Россия  
Дата: 20.04.11 06:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ищу рабочий пример сериализации полиморфных структур с помощью буста.


и где там полиморфизм?
In Zen We Trust
Re: boost serialization polymorphic
От: uzhas Ниоткуда  
Дата: 20.04.11 06:31
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Ищу рабочий пример сериализации полиморфных структур с помощью буста.

А>Данный код не работает: сериализуется только базовый класс. Где ошибка?
я в бусте ничего не понимаю, но немного почитал документацию
http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/serialization.html#derivedpointers

It turns out that the kind of object serialized depends upon whether the base class (base in this case) is polymophic or not. If base is not polymorphic, that is if it has no virtual functions, then an object of the type base will be serialized. Information in any derived classes will be lost. If this is what is desired (it usually isn't) then no other effort is required.

If the base class is polymorphic, an object of the most derived type (derived_one or derived_two in this case) will be serialized. The question of which type of object is to be serialized is (almost) automatically handled by the library.

попробуйте добавить виртуальный деструктор в базу
Re[2]: boost serialization polymorphic
От: endight  
Дата: 20.04.11 06:42
Оценка:
U>попробуйте добавить виртуальный деструктор в базу
Спасибо, помогло.
Re: boost serialization polymorphic
От: endight  
Дата: 24.04.11 16:32
Оценка: :)
Продолжаю биться с бустом. Та же самая проблема, только для сериализации сторонних классов, без фунции-члена serialize.
Проблема со способом сериализации базового объекта.

--

Есть примерно следующее:

class b2Shape
{
  virtual ... = 0;
  virtual ~b2Shape();
};

class b2PolygonShape: public b2Shape
{
  ...
};

BOOST_SERIALIZATION_ASSUME_ABSTRACT(b2Shape)
BOOST_CLASS_EXPORT(b2PolygonShape)

template<class Archive>
inline void serialize(Archive& ar, b2Shape& t, const unsigned int file_version)
{
  boost::serialization::split_free(ar, t, file_version);
}

template<class Archive>
inline void serialize(Archive& ar, b2PolygonShape& t, const unsigned int file_version)
{
  ar & boost::serialization::make_nvp("b2Shape", boost::serialization::base_object<b2Shape>(t));
  boost::serialization::split_free(ar, t, file_version);
}

В файле получается следующее:
            <t.shape class_id="6" class_name="b2PolygonShape" tracking_level="1" version="0" object_id="_1">
                <name>
                    <name>
                        <name>
                            <name>
                                <name>
                                    <name>
                                                           ...
и так 130 mb и все падает.


По верному ли пути иду?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.