Я пытаюсь (де) сериализовать полиморфный вектор, но у меня разные проблемы с разными попытками. Весь порядок событий таков:
- Сериализация полиморфного вектора на стороне сервера
- Отправить сериализованную строку по сети
- Десериализовать в новый полиморфный вектор на стороне клиента
- Редактировать данные в векторе (включая добавление, редактирование и удаление) на стороне клиента
- Сериализовать отредактированный полиморфный вектор на стороне клиента
- Отправить новую сериализованную строку по сети
- Десериализуйте новый полиморфный вектор на стороне сервера ‹--- Вот где моя проблема
У меня есть класс, производный (и DerivedB, DerivedC и т. Д.), Который является производным от Class Base и класса LotsOfBases, который содержит вектор виртуальной базы.
Хотя я не понимаю, как это могло вызвать проблему - я считаю, что моя проблема заключается в том, что объекты в векторе, поступающие с сервера, находятся в определенном порядке (AAABBCCCCD), и когда они возвращаются, они находятся в случайном порядке и может иметь разное количество производных классов (ABABCDDDA).
Ниже приведены мои неудачные попытки. Используя метод 2 ниже, если мне повезет, я могу отправлять информацию туда и обратно (если порядок классов остается прежним), но когда типы классов меняют порядок, начинают возникать проблемы.
Используемый код и ошибка компиляции / выполнения:
Конечно, компилируется без дополнений, но у меня возникают проблемы с RunTime, поскольку Boost не знает, какой класс какой ... Итак, я попробовал:
ar.template register_type<Derived>() ;
- Регистрация класса в "LotsOfBases" .h "функция Serialize и получил следующее при вызове в RunTime:Error @ RunTime: what(): Input Stream Error
- Это то, где я добился наибольшего успеха и о чем в основном упоминалось выше.ar.register_type<static...
Но я получаю ошибки компиляции, заявляя, что это функция (видел это еще где на StackOverflowBOOST_CLASS_EXPORT(Derived) ;
В конце файла ".h", который дает n предупреждений для каждого подкласса Base и не может быть скомпилирован. Ошибка:multiple definition of ``boost::archive::detail::extra_detail::init_guid<Derived>::g'
Я пробовал зарегистрировать классы в архиваторе в главном месте, где LotsOfBases десериализуется. Предупреждения компилятора
BOOST_CLASS_EXPORT_IMPLEMENT(TextQuestion)
из Экспорт сериализации классов - то же самое ошибки как 6 iirc.Приведенные выше примеры без ссылок взяты из моего троллинга через ~ 30 страниц в StackOverflow, которые похожи, но предлагаемые ими решения, похоже, не работают для меня или связаны с Boost Serialization, но несколько неактуальны.
Ниже приводится сокращенная версия моего кода (без изменений, внесенных из других источников):
Код классов
LotsOfBases:
#include "s11n.h" //Import All Serialization Headers In Correct Order
namespace boost { namespace serialization { class access ; } }
class LotsOfBases
{
public:
std::vector<Base *> getAllBases() ;
protected:
std::vector<Base *> allBases() ;
friend class boost::serialization::access ;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & allBases ;
}
} ;
База:
#include "s11n.h" //Import All Serialization Headers In Correct Order
namespace boost { namespace serialization { class access ; } }
class Base
{
public:
Base() ;
~Base() ;
virtual std::string getBaseLocation() ;
protected:
std::string baseLocation ;
friend class boost::serialization::access ;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & baseLocation ;
}
} ;
Производный
#include "s11n.h" //Import All Serialization Headers In Correct Order
namespace boost { namespace serialization { class access ; } }
class Derived
{
public:
Derived() ;
bool getIsAttackableBase() ;
private:
bool isAttackableBase ;
typedef Base _super;
friend class boost::serialization::access ;
template <typename Archive>
void serialize(Archive& ar, const unsigned int /*version*/)
{
ar & boost::serialization::base_object<_super>(*this) ;
ar & isAttackableBase ;
}
Я уверен, что это не должно быть так сложно. Итак, я думаю, мой вопрос ... Что я делаю не так? С чего мне начать читать / исследовать сейчас?