c++ - Cereal 不支持原始指针

标签 c++ serialization cereal

编辑:问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很误导,我改了。感谢 Андрей Беньковский 的帮助。


我正在使用 cereal 在我的引擎中为 3D 模型编写序列化函数,事实证明它非常高效且易于使用。 到目前为止,当我测试(反)序列化一个简单的网格时,一切都很好。 但现在我正在尝试反序列化另一个类,但遇到了一个我没有得到的问题。

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 不支持序列化原始指针 - 请使用智能指针 即使它不是指针。在代码的另一部分,类似的东西工作得很好。如果有人能帮我解决这个问题,我会很高兴。

最佳答案

我从未使用过 Cereal,但看起来它希望您使用这样的东西:

map<string, unique_ptr<MeshDescription> >

获取std::unique_ptr我通常#include <memory>

来自 cereal documentation :

cereal 支持序列化智能指针但不支持哑指针(也就是说原始指针,例如 int * )或引用。可以通过包含 <cereal/types/memory.hpp> 找到指针支持.

可能这意味着您必须包含他们的 header 而不是标准 header 。

附言当您的对象拥有资源(例如动态分配的 MeshDescription )时,始终将资源管理(分配、释放、复制等)委托(delegate)给单独的类(智能指针、集合、包装器等)。参见 rule of 0 .

关于c++ - Cereal 不支持原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33345211/

相关文章:

c++ - 在 C++ 中使用 POCO 和 cereal 反序列化多个对象

c++ - 函数如何修改C++中按值传递的参数?

c++ - 有没有办法使用 Cereal/C++ 为 std::map 指定更简单的 JSON(反)序列化?

c++ - 在 C++ 构造函数中有一个循环是个好主意吗?

c++ - 索引 wchar_t 数组中的字符

c++ - 将 vector 投影到单位框的有效方法

c++ - 如何使用 boost::preprocessor 解压序列?

java - java 枚举上的自定义字段未被序列化

json - swift 2中NSJSONSerialization的线程中断1.1

php - 我是否应该以及如何将我的用户对象保存到 session 中?