Ищу рабочий пример сериализации полиморфных структур с помощью буста.
Данный код не работает: сериализуется только базовый класс. Где ошибка?
#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);
}
Здравствуйте, Аноним, Вы писали:
А>Ищу рабочий пример сериализации полиморфных структур с помощью буста.
А>Данный код не работает: сериализуется только базовый класс. Где ошибка?
я в бусте ничего не понимаю, но немного почитал документацию
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.
попробуйте добавить виртуальный деструктор в базу
Продолжаю биться с бустом. Та же самая проблема, только для сериализации сторонних классов, без фунции-члена 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 и все падает.
По верному ли пути иду?