【问题标题】:Cereal: deserialize a vector of objects without default constructor谷物:反序列化没有默认构造函数的对象向量
【发布时间】:2017-05-07 17:02:12
【问题描述】:

我正在尝试使用Cereal 来序列化一个没有默认构造函数的对象。直接或通过智能指针存储此类对象有效。然而, 当我将对象放入容器时,它不再编译:

error: no matching function for call to ‘Node::Node()’

有没有办法让谷物在没有默认构造函数的情况下存储/恢复对象向量?

我的测试代码:

#include <fstream>
#include <cereal/archives/json.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/types/vector.hpp>


class Node {
public:
    Node(int* parent) {};

    int value_1;

    template<class Archive>
    void serialize(Archive& archive) {
        archive(
                CEREAL_NVP(value_1)
        );
    }

    template<class Archive>
    static void load_and_construct(Archive& archive, cereal::construct<Node>& construct) {
        construct(nullptr);
        construct->serialize(archive);
    }
};

int main() {
    std::string file_path = "../data/nodes.json";
    Node node_1{nullptr};  // this would serialize

    std::vector<Node> nodes;  // this does not
    nodes.push_back(Node{nullptr});
    nodes.push_back(Node{nullptr});

    std::vector<std::unique_ptr<Node>> node_ptrs;  // this would serialize
    node_ptrs.push_back(std::make_unique<Node>(nullptr));
    node_ptrs.push_back(std::make_unique<Node>(nullptr));

    {  //store vector
        std::ofstream out_file(file_path);
        cereal::JSONOutputArchive out_archive(out_file);
        out_archive(CEREAL_NVP(nodes));
    }

    {  // load vector
        std::ifstream in_file(file_path);
        cereal::JSONInputArchive in_archive(in_file);
        in_archive(nodes);
    }

    return 0;
}

【问题讨论】:

    标签: c++ cereal


    【解决方案1】:

    据我了解这个库的工作方式,没有办法反序列化至少对于动态分配的对象没有默认构造函数的东西。

    这下的逻辑如下:

    1. 需要反序列化vector&lt;Node&gt;
    2. 为此,您需要分配适当数量的内存
    3. cereal 不知道构造函数,无法自行正确分配对象内存
    4. 为了提供正确的对象构建,它需要默认构造函数

    【讨论】:

    • 想象一下加载一个没有默认构造函数的类型的场景。谷物序列化的接口要求您传递对要使用序列化数据实例化的对象的引用。在没有默认构造函数的情况下,您(用户)必须在谷物看到它之前已经初始化了这样的对象。另一种方法是让谷物进行对象的实际构造,这只能发生在动态创建的(即指针)对象中,因此谷物可以预加载参数以传递给构造函数,如load_and_construct。跨度>
    猜你喜欢
    • 2013-11-05
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多