2016-04-27 2 views
3

Je suis donc confuse. Il ne compilera pas pour une fonction de sérialisation externe. Il donne l'erreurErreur de sérialisation de la céréale

cereal n'a pas trouvé de fonctions de sérialisation de sortie pour la combinaison de types et d'archives fournis avec .

Ainsi, le code ci-dessous ne compile pas

#include <fstream> 
#include <glm/glm.hpp> 
#include "SceneObject.h" 
#include <cereal/cereal.hpp> 
#include <cereal/archives/json.hpp> 

template<typename Archive> void serialize(Archive& archive, glm::vec3& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

struct something 
{ 
public: 
    float x, y, z; 
}; 
template<typename Archive> void serialize(Archive& archive, something& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

int main(int argc, char** argv) 
{ 
    SceneObject test; 
    test.transform().setPosition(1.0f,2.0f,3.0f); 

    { 
     std::ofstream file("TestPath.json"); 
     cereal::JSONOutputArchive output(file); 
     glm::vec3 p = test.transform().getPosition(); 
     output(p); 
    } 

    return 0; 
} 

mais cela ne compile

#include <fstream> 
#include <glm/glm.hpp> 
#include "SceneObject.h" 
#include <cereal/cereal.hpp> 
#include <cereal/archives/json.hpp> 

template<typename Archive> void serialize(Archive& archive, glm::vec3& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

struct something 
{ 
public: 
    float x, y, z; 
}; 
template<typename Archive> void serialize(Archive& archive, something& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 

int main(int argc, char** argv) 
{ 
    SceneObject test; 
    test.transform().setPosition(1.0f,2.0f,3.0f); 

    { 
     std::ofstream file("TestPath.json"); 
     cereal::JSONOutputArchive output(file); 
     glm::vec3 p = test.transform().getPosition(); 
     something s; 
     s.x = p.x; 
     s.y = p.y; 
     s.z = p.z; 
     output(s); 
    } 

    return 0; 
} 

copier littéralement et coller le code sauver de GLM :: vec3 à quelque chose et juste changé glm :: vec3 à 'quelque chose'. Cela n'a aucun sens pour moi pourquoi cela fonctionnerait pour l'un et pas l'autre. Je pense que cela pourrait être une question d'espace de noms, mais je n'ai aucune idée de comment résoudre ce problème.

Répondre

4

Bien apparemment poster m'a fait trouver la solution.

Vous devez vous assurer que les fonctions de sérialisation partagent le même espace, donc si je les envelopper comme

namespace glm 
{ 
template<typename Archive> void serialize(Archive& archive, glm::vec3& v3) 
{ 
    archive(cereal::make_nvp("x", v3.x), cereal::make_nvp("y", v3.y), cereal::make_nvp("z", v3.z)); 
} 
} 

Il fonctionne. Un peu étrange, mais c'est ce que c'est.