Cereal不支持原始指针

Cereal does not support raw pointers

本文关键字:指针 原始 不支持 Cereal      更新时间:2023-10-16

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)时,总是将资源管理(分配,回收,复制等)委托给一个单独的类(智能指针,集合,包装器等)。