谷物序列化错误
Cereal serialization error
所以我很困惑。它不会针对外部序列化函数进行编译。它给出了错误
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 更改为"某物"。对我来说,为什么它对一个而不是另一个有效是没有意义的。我认为这可能是命名空间的事情,但我不知道如何解决这个问题。
显然发布让我找到了解决方案。
您需要确保序列化函数共享相同的命名空间,因此如果我像包装它们一样
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));
}
}
它有效。有点奇怪,但事实就是如此。
我可以
确认你的结论。 对于外部定义的序列化函数,您可以将它们放在同一个命名空间中,以使 Cereal 能够查看/使用它们。
可以像这样实现所有版本的 VEC2-4、MAT2-4 和 Quat 类型的完整/模板化序列化函数集(需要 GLM 版本>=0.9.6,https://www.g-truc.net/post-0693.html):
#include <glm/glm.hpp>
#include <cereal/cereal.hpp>
namespace glm
{
template<class Archive, class T>
void serialize(Archive &archive, glm::vec<2, T, glm::defaultp> &v)
{
archive(cereal::make_nvp("x", v.x),
cereal::make_nvp("y", v.y));
}
template<class Archive, class T>
void serialize(Archive &archive, glm::vec<3, T, glm::defaultp> &v)
{
archive(cereal::make_nvp("x", v.x),
cereal::make_nvp("y", v.y),
cereal::make_nvp("z", v.z));
}
template<class Archive, class T>
void serialize(Archive &archive, glm::vec<4, T, glm::defaultp> &v)
{
archive(cereal::make_nvp("x", v.x),
cereal::make_nvp("y", v.y),
cereal::make_nvp("z", v.z),
cereal::make_nvp("w", v.w));
}
// glm matrices serialization
template<class Archive, class T>
void serialize(Archive &archive, glm::mat<2, 2, T, glm::defaultp> &m){ archive(m[0], m[1]); }
template<class Archive, class T>
void serialize(Archive &archive, glm::mat<3, 3, T, glm::defaultp> &m){ archive(m[0], m[1], m[2]); }
template<class Archive, class T>
void serialize(Archive &archive, glm::mat<4, 4, T, glm::defaultp> &m){ archive(m[0], m[1], m[2], m[3]); }
template<class Archive, class T>
void serialize(Archive &archive, glm::qua<T, glm::defaultp> &q)
{
archive(cereal::make_nvp("x", q.x),
cereal::make_nvp("y", q.y),
cereal::make_nvp("z", q.z),
cereal::make_nvp("w", q.w));
}
}// namespace glm
相关文章:
- 当我尝试在C++中对谷物进行序列化时,我遇到了一个奇怪的错误
- 解决了使用提升序列化时的清理器错误
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- 增强序列化,按基类型加载存档类会产生错误的数据
- 提升序列化异常错误
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- 分段错误:C++中的结构序列化和 MPI 数据传输
- Boost::序列化存储结构时的堆栈溢出错误
- 从 boost::存档:binary_iarchive 反序列化 std::string 时出现错误的分配异常
- C++Boost序列化:输入流错误
- 提升反序列化问题:运行时输入流错误 (c++)
- Avro 反序列化错误 - ArrayIndexOutOfBoundsException
- 如何设计可序列化类以使任何非序列化属性都会导致编译时错误
- 提升序列化的链接器错误
- 链接器错误:静态链接提升序列化库
- C++ 提升序列化提升::archive_exception:输出流错误
- 谷物序列化错误
- Boost序列化:XCode 5项目中的链接器错误,由CMake生成(带最小完整示例)
- Boost二进制序列化-固定长度错误的双数组
- 提升序列化未注册类错误