使用具有嵌入类的boost序列化类,但仅序列化包装器中的信息

时间:2014-09-23 12:46:21

标签: c++ boost boost-serialization

我正在使用Boost 1.47.0来序列化一些用于网络传输的类。我对图书馆不是很熟悉,但是我已经完成了相当多的文档,现在经过2到3天的工作后,我需要一些帮助。

我有一个班级

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;
    }

};

编辑:添加了相机类。

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;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

好的,所以我发现了问题,现在我正在踢自己。

在我为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);
}

但应该是:

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);
}

谢谢大家试图帮助我:)。