Я задаюсь этим вопросом. У меня есть программа на C++ с несколькими структурами данных, происходящими из общего корня, и мне нужно сериализовать их с помощью Boost. Каждый из них имеет встроенную функцию-член для приема посетителя (поэтому я могу посетить структуру без оператора «переключатель»).
Объекты выглядят так:
В файле .h:
// Graphic component.
struct GraphicComponent : public Component {
... data members ...
void accept(ComponentVisitor &vis) { vis.visitGraphicComponent(*this); }
private:
// Serialization routine.
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &a, const unsigned int v);
};
BOOST_CLASS_EXPORT_KEY(GraphicComponent)
// Position component.
struct PositionComponent : public Component {
... data members ...
void accept(ComponentVisitor &vis) { vis.visitPositionComponent(*this); }
private:
// Serialization routine.
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &a, const unsigned int v);
};
BOOST_CLASS_EXPORT_KEY(PositionComponent)
...
В файле .cpp я объявляю процедуры «сериализации»:
BOOST_CLASS_EXPORT_IMPLEMENT(GraphicComponent)
BOOST_CLASS_EXPORT_IMPLEMENT(PositionComponent)
...
template<class Archive>
void GraphicComponent::serialize(Archive &a, const unsigned int v)
{
a & boost::serialization::base_object<Component>(*this);
... serialize data members ...
}
template<class Archive>
void PositionComponent::serialize(Archive &a, const unsigned int v)
{
a & boost::serialization::base_object<Component>(*this);
... serialize data members ...
}
...
Так же включаю архив Boost через общую шапку. Насколько я могу судить, все выглядит правильно. В базовом компоненте также есть «BOOST_SERIALIZATION_ASSUME_ABSTRACT», поскольку «accept» является чисто виртуальным.
Когда я запускаю программу и дохожу до того момента, когда она сериализует этот материал, я получаю
what(): unregistered class - derived class not registered or exported
Сериализация происходит через указатель на базовый Компонент.
Я слышал о проблемах, связанных с сериализацией Boost и «библиотеками». Система сборки, которую я использовал, CMake, настроена на компиляцию программы путем сборки ее подкомпонентов в библиотеки, а затем объединения их в один исполняемый файл для создания окончательной программы. Может ли это быть проблема?
Кроме того, Component происходит от std::enable_shared_from_this (это C++11 STL, а не Boost) - может ли это быть проблемой? Если да, то что можно с этим сделать?
main
. Код фиктивной функции —static volatile int g_iDummyInitialization(0); void InitModule00Serialzation(void) { g_iDummyInitialization = 1; }
. В моем случае помогает. - person megabyte1024   schedule 23.06.2015