2014-09-23 29 views
1

我正在使用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; 
    } 

}; 

編輯:增加了相機類。

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

回答

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

謝謝大家,試圖幫助我:)

+0

...福氣! – alfC 2014-09-23 15:40:38

+0

現在我也踢了自己,因爲我已經[看過這個特殊的陷阱](http://stackoverflow.com/a/23177984/85371)在SO上。 +1 – sehe 2014-09-23 15:47:43

相關問題