Я использую Boost 1.47.0 для сериализации некоторых классов для сетевой передачи. Я не очень хорошо знаком с библиотекой, но я прошел через документацию совсем немного, и теперь, спустя 2 или 3 дня, я не получил эту работу, мне нужна помощь.Сериализация класса с boost, который имеет встроенные классы, но только информация в оболочке сериализована
У меня есть класс
class NetworkMessage
{
public:
NetworkMessage(){};
void addPlayer(Player* player);
std::string serializeToString();
Player getPlayer();
virtual ~NetworkMessage();
protected:
private:
Player players;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & players;
}
};
На данный момент я ограничен его только передача информации одного игрока в сообщении, и что работает нормально, но мой игрок содержит еще один класс в ней, который является камера. Все мои родные члены C++ в моем классе классов упорядочиваются правильно. Однако, когда я десериализую, вся информация для камеры моих игроков теряется. Но другая информация хранится и работает. Я отлаживал свои сетевые передачи, и получаемое сообщение имеет в себе всю сериализованную информацию.
Я не уверен, что я просто неправильно понял, как работает библиотека, но рука для оказания помощи будет очень полезной, даже просто совет, который поможет мне в правильном направлении того, что может быть неправильным.
Также как примечание стороны, я использую стандартный метод serialize
, который обеспечивает форсирование.
class Player
{
public:
Player(){};
Player(float _x, float _y, float _z, std::string _name);
void setCamera(Camera camera);
vec3 getLocation();
std::string getName();
Camera getCamera();
virtual ~Player();
protected:
private:
float x;
float y;
float z;
std::string name;
Camera playerCam;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & x;
ar & y;
ar & z;
ar & name;
ar & playerCam;
}
};
EDIT: добавлен класс камеры.
class Camera
{
public:
Camera(){};
Camera(vec3 r, vec3 u, vec3 d);
Camera& operator=(Camera rhs);
void rotateCamera(int xDelta, int yDelta, int xMid, int yMid);
void setKey(unsigned char key, bool state);
void updateCamera();
void print();
void printVec(vec3 vectr);
mat4 getViewMatrix();
vec3 getEye();
private:
mat4 view;
vec3 r;
vec3 u;
vec3 d;
vec3 direction;
bool keyStates[256];
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar &r;
ar &u;
ar &d;
ar &direction;
ar &keyStates;
ar &view;
}
};
Я также добавляю код для сериализации векторов и матриц GLM.
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, glm::detail::tmat4x4<float> transform, const unsigned int version)
{
ar & transform[0];
ar & transform[1];
ar & transform[2];
ar & transform[3];
}
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec3<float> vec, const unsigned int version)
{
ar & vec.x;
ar & vec.y;
ar & vec.z;
}
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec4<float> vec, const unsigned int version)
{
ar & vec.x;
ar & vec.y;
ar & vec.z;
ar & vec.w;
}
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec2<float> vec, const unsigned int version)
{
ar & vec.x;
ar & vec.y;
}
}
}
... хороший улов! – alfC
И теперь я тоже пинаю, так как я [видел эту лихорадку раньше] (http://stackoverflow.com/a/23177984/85371) на SO. +1 – sehe