Это немного странно, но я собираюсь ответить на свой вопрос. Я только что понял, как заставить мой пример работать выше.
Вот оно, решение. Каждый раз, когда нам нужно сериализовать класс, который наследует атрибуты от другого класса, нам нужно использовать макрос:
BOOST_CLASS_EXPORT(T)
В соответствии с документом boost serialization
BOOST_CLASS_EXPORT в том же исходном модуле, который включает в себя любой из заголовков архивных классов, будет создавать экземпляр кода, необходимого для сериализации полиморфных указателей указанного типа на все эти архивные классы. Если заголовки архивных классов не включены, то экземпляр кода не будет создан.
Обратите внимание, что реализация этой функции требует, чтобы макрос BOOST_CLASS_EXPORT появлялся после, и включал любые заголовки архивных классов, для которых должен быть создан экземпляр кода.
Так что в моем случае мой файл main.cpp теперь:
#include <fstream>
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include <boost\serialization\export.hpp>
#include "Coordinate.h"
#include "Move.h"
#include "MoveNormal.h"
BOOST_CLASS_EXPORT(MoveNormal)
int main(int argc, char *argv[]) {
Coordinate *c = new Coordinate(150);
Move *m = new MoveNormal(c);
std::cout << "m.getDestination().get(): " << m->getDestination()->get() << std::endl;
{
std::ofstream ofs("f.txt");
boost::archive::text_oarchive oa(ofs);
oa << m;
}
Move *n;
{
std::ifstream ifs("f.txt");
boost::archive::text_iarchive ia(ifs);
ia >> n;
}
std::cout << "n.getDestination().get(): " << n->getDestination()->get() << std::endl;
return 0;
}
Просто убедитесь, что вы включили все необходимые буст-архивы, прежде чем использовать экспорт MACRO.
Чтобы завершить мой проект, кроме сериализации, мне нужно записать их в сокет tcp, используя boost :: asio.
Итак, давайте предположим, что у меня есть заголовок соединения, такой как этот , и что теперь у меня есть другой класс с именем MoveJump, определенный в моем MoveJump.h
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include "Coordinate.h"
#include "Move.h"
class MoveJump : public Move {
public:
MoveJump() {}
MoveJump(Coordinate *c) { this->destinatio = c; }
~MoveJump() {}
virtual bool isJump(void);
private:
friend class boost::serialization::access;
template<typename Archive>
void serializize(Archive &ar, const unsigned int version) {
ar & boost::serialization::base_object<Move>(*this);
}
};
Теперь, чтобы сериализовать эти структуры, мой основной вид выглядит так
#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>
#include <boost\serialization\export.hpp>
#include <fstream>
#include "Coordinate.h"
#include "Move.h"
// And now we register all the possible Moves
#include "MoveNormal.h"
BOOST_CLASS_EXPORT(MoveNormal)
#include "MoveJump.h"
BOOST_CLASS_EXPORT(MoveJump)
int main(int argc, char *argv[]) {
Coordinate *c = new Coordinate(10);
Move *m = new MoveNormal(c);
Coordinate *d = new Coordinate(15);
Move *j = new MoveJump(d);
{
std::ofstream ofs("m.txt");
boost::archive::text_oarchive oa(ofs);
oa << m;
}
{
std::ofstream ofs("j.txt");
boost::archive::text_oarchive oa(ofs);
oa << j;
}
}
Хитрость заключается в регистрации классов, которые будут сериализованы, когда у нас есть указатель на базовый класс.
Если внутри моего Move.h у меня есть больше указателей на другие базовые классы, что я делаю в своем проекте, нам нужно включить в main все заголовки и зарегистрировать все возможные классы, которые расширяют базовый класс.
Надеюсь, это поможет кому-то, кто может столкнуться с подобными проблемами в будущем.
Не стесняйтесь представить новые возможные решения.
Спасибо