【问题标题】:Cereal serialization error谷物序列化错误
【发布时间】:2016-08-21 17:42:38
【问题描述】:

所以我很困惑。它不会为外部序列化函数编译。它给出了错误

cereal 找不到任何输出序列化函数 提供类型和存档组合。

所以下面的代码不能编译

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

但这确实可以编译

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

我将 glm::vec3 中的保存代码复制并粘贴到某物,然后将 glm::vec3 更改为“某物”。这对我来说毫无意义,为什么它适用于一个而不是另一个。我认为这可能是一个命名空间的问题,但我不知道如何解决这个问题。

【问题讨论】:

    标签: c++ serialization save glm-math cereal


    【解决方案1】:

    显然发帖让我找到了解决方案。

    你需要确保序列化函数共享相同的命名空间,所以如果我像这样包装它们

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

    它有效。有点奇怪,但就是这样。

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2016-12-31
      • 2015-07-06
      • 2019-01-05
      • 2015-01-15
      相关资源
      最近更新 更多