C++ 使用具有嵌入类的boost序列化类,但仅序列化包装器中的信息
我正在使用Boost1.47.0序列化一些用于网络传输的类。我对这个库不是很熟悉,但我已经阅读了很多文档,现在在2到3天没有让它工作之后,我需要一些帮助 我有一节课C++ 使用具有嵌入类的boost序列化类,但仅序列化包装器中的信息,c++,boost,boost-serialization,C++,Boost,Boost Serialization,我正在使用Boost1.47.0序列化一些用于网络传输的类。我对这个库不是很熟悉,但我已经阅读了很多文档,现在在2到3天没有让它工作之后,我需要一些帮助 我有一节课 class NetworkMessage { public: NetworkMessage(){}; void addPlayer(Player* player); std::string serializeToString(); Player getPlaye
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;
}
};
编辑:添加了摄影机类
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;
}
};
class摄像机
{
公众:
摄影机(){};
摄像机(vec3 r、vec3 u、vec3 d);
摄像机和操作员=(摄像机右侧);
void rotateCamera(int xDelta,int yDelta,int xMid,int yMid);
无效设置键(无符号字符键,布尔状态);
void updateCamera();
作废打印();
无效打印向量(vec3-vectr);
mat4 getViewMatrix();
vec3-getEye();
私人:
mat4视图;
vec3r;
vec3u;
vec3d;
vec3方向;
布尔键状态[256];
好友类boost::serialization::access;
模板
无效序列化(存档和ar,常量未签名整数版本)
{
ar&r;
ar&u;
研发;
ar与方向;
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;
}
}
}
namespace boost
{
命名空间序列化
{
模板
无效序列化(归档和ar,glm::详细信息::tmat4x4转换,常量无符号整数版本)
{
ar&变换[0];
ar&变换[1];
ar&变换[2];
ar&变换[3];
}
模板
无效序列化(存档和ar,glm::详细信息::tvec3 vec,常量未签名整数版本)
{
ar&vec.x;
ar&vec.y;
ar&vec.z;
}
模板
无效序列化(归档和ar,glm::详细信息::tvec4 vec,常量未签名整数版本)
{
ar&vec.x;
ar&vec.y;
ar&vec.z;
ar&vec.w;
}
模板
无效序列化(归档和ar,glm::详细信息::tvec2 vec,常量未签名整数版本)
{
ar&vec.x;
ar&vec.y;
}
}
}
好吧,我找到了问题所在,我现在正在自责
在我的glm相关商品的序列化中,我需要将它们作为参考传递。我没有这么做。所以基本上我有:
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec3<glm::mediump_float> vec, const unsigned int version)
{
ar & boost::serialization::make_nvp("x", vec.x);
ar & boost::serialization::make_nvp("y", vec.y);
ar & boost::serialization::make_nvp("z", vec.z);
}
模板
无效序列化(存档和ar,glm::详细信息::tvec3 vec,常量未签名整数版本)
{
ar&boost::序列化::生成nvp(“x”,vec.x);
ar&boost::序列化::生成nvp(“y”,vec.y);
ar&boost::序列化::生成nvp(“z”,vec.z);
}
但它应该是:
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec3<glm::mediump_float>& vec, const unsigned int version)
{
ar & boost::serialization::make_nvp("x", vec.x);
ar & boost::serialization::make_nvp("y", vec.y);
ar & boost::serialization::make_nvp("z", vec.z);
}
模板
无效序列化(存档和ar、glm::详细信息::tvec3和vec、常量未签名整数版本)
{
ar&boost::序列化::生成nvp(“x”,vec.x);
ar&boost::序列化::生成nvp(“y”,vec.y);
ar&boost::序列化::生成nvp(“z”,vec.z);
}
谢谢所有试图帮助我的人:)现在我也在踢自己,因为我一直在踢自己+1.
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec3<glm::mediump_float>& vec, const unsigned int version)
{
ar & boost::serialization::make_nvp("x", vec.x);
ar & boost::serialization::make_nvp("y", vec.y);
ar & boost::serialization::make_nvp("z", vec.z);
}