gpt4 book ai didi

c++ - Cereal:在没有默认构造函数的情况下反序列化对象 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:41 28 4
gpt4 key购买 nike

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

错误:没有用于调用“Node::Node()”的匹配函数

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

我的测试代码:

#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;
}

最佳答案

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

其逻辑如下:

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

关于c++ - Cereal:在没有默认构造函数的情况下反序列化对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834245/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com