Cereal 不支持原始指针
Cereal does not support raw pointers
编辑: 问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化为我在函数内部声明的 object 。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很误导,我改了。感谢 Андрей Беньковский 的帮助。
我正在使用 cereal 在我的引擎中为 3D 模型编写序列化函数,事实证明它非常高效且易于使用。
到目前为止,当我测试(反)序列化一个简单的网格时,一切都很好。
但是现在我正在尝试反序列化另一个 class 但是 运行 我没有得到一个问题。
void loadFile(std::string filepath)
{
DescriptionFile file;
{
ifstream stream = ifstream(filepath, std::ifstream::binary);
PortableBinaryInputArchive archive(stream);
archive(file);
stream.close();
}
}
这是我的 class,应该反序列化:
struct DescriptionFile
{
public:
DescriptionFile(){}
map<string, MeshDescription*> meshDescriptions;
map<string, ModelDescription*> modelDescriptions;
public:
template<class Archive>
void serialize(Archive & archive)
{
archive(meshDescriptions, modelDescriptions);
}
};
它给我编译器错误:
Cereal 不支持序列化原始指针 - 请使用智能指针
即使它不是指针。在代码的另一部分,类似的东西工作得很好。如果有人能帮我解决这个问题,我会很高兴。
我从未使用过 Cereal,但看起来它希望您使用这样的东西:
map<string, unique_ptr<MeshDescription> >
要得到std::unique_ptr我通常#include <memory>
cereal 支持序列化智能指针但不支持哑指针(即原始指针,如int *
)或引用。可以通过包含 <cereal/types/memory.hpp>
.
找到指针支持
可能这意味着您必须包括他们的 header 而不是标准。
P.S。当您的 object 拥有资源(例如动态分配的 MeshDescription
)时,始终将资源管理(分配、解除分配、复制等)委托给单独的 class(智能指针、collection、包装纸等)。参见 rule of 0。
编辑: 问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化为我在函数内部声明的 object 。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很误导,我改了。感谢 Андрей Беньковский 的帮助。
我正在使用 cereal 在我的引擎中为 3D 模型编写序列化函数,事实证明它非常高效且易于使用。 到目前为止,当我测试(反)序列化一个简单的网格时,一切都很好。 但是现在我正在尝试反序列化另一个 class 但是 运行 我没有得到一个问题。
void loadFile(std::string filepath)
{
DescriptionFile file;
{
ifstream stream = ifstream(filepath, std::ifstream::binary);
PortableBinaryInputArchive archive(stream);
archive(file);
stream.close();
}
}
这是我的 class,应该反序列化:
struct DescriptionFile
{
public:
DescriptionFile(){}
map<string, MeshDescription*> meshDescriptions;
map<string, ModelDescription*> modelDescriptions;
public:
template<class Archive>
void serialize(Archive & archive)
{
archive(meshDescriptions, modelDescriptions);
}
};
它给我编译器错误: Cereal 不支持序列化原始指针 - 请使用智能指针 即使它不是指针。在代码的另一部分,类似的东西工作得很好。如果有人能帮我解决这个问题,我会很高兴。
我从未使用过 Cereal,但看起来它希望您使用这样的东西:
map<string, unique_ptr<MeshDescription> >
要得到std::unique_ptr我通常#include <memory>
cereal 支持序列化智能指针但不支持哑指针(即原始指针,如int *
)或引用。可以通过包含 <cereal/types/memory.hpp>
.
可能这意味着您必须包括他们的 header 而不是标准。
P.S。当您的 object 拥有资源(例如动态分配的 MeshDescription
)时,始终将资源管理(分配、解除分配、复制等)委托给单独的 class(智能指针、collection、包装纸等)。参见 rule of 0。