2014-09-23 3 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; 
    } 

}; 

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

ответ

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

+0

И теперь я тоже пинаю, так как я [видел эту лихорадку раньше] (http://stackoverflow.com/a/23177984/85371) на SO. +1 – sehe