Cereal不支持原始指针
Cereal does not support raw pointers
Edit:问题标题是基于对我得到的编译错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很容易误导人,所以我改了。感谢Андрей Беньковский的帮助。
我在我的引擎中使用谷物编写3D模型的序列化函数,这被证明是非常高效和易于使用的。到目前为止,当我测试(反)序列化一个简单的Mesh时,一切都很好。但现在我试图反序列化另一个类,但遇到了一个问题,我没有得到。
void loadFile(std::string filepath)
{
DescriptionFile file;
{
ifstream stream = ifstream(filepath, std::ifstream::binary);
PortableBinaryInputArchive archive(stream);
archive(file);
stream.close();
}
}
这是我的类,它应该被反序列化:
struct DescriptionFile
{
public:
DescriptionFile(){}
map<string, MeshDescription*> meshDescriptions;
map<string, ModelDescription*> modelDescriptions;
public:
template<class Archive>
void serialize(Archive & archive)
{
archive(meshDescriptions, modelDescriptions);
}
};
它给了我编译错误:谷物不支持序列化原始指针-请使用智能指针尽管它不是指针。在代码的另一部分,类似的东西工作得很好。如果有人能帮我解决这个问题,我会很高兴的。
我从未使用过Cereal,但它似乎希望您使用这样的内容:
map<string, unique_ptr<MeshDescription> >
获取std::unique_ptr I通常是#include <memory>
From cereal文档:
cereal支持序列化智能指针,但不支持序列化哑指针(即原始指针,如int *
)或引用。指针支持可以通过包含<cereal/types/memory.hpp>
来找到。
这可能意味着你必须包含它们的标头而不是标准。
注:当你的对象拥有资源(例如动态分配的MeshDescription
)时,总是将资源管理(分配,回收,复制等)委托给一个单独的类(智能指针,集合,包装器等)。
相关文章:
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++指针无法更改其原始值
- 为包含原始指针的对象C++智能指针
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上