Cereal:在没有默认构造函数的情况下反序列化对象向量
Cereal: deserialize a vector of objects without default constructor
我正在尝试使用 Cereal 序列化一个没有默认构造函数的对象。直接或通过智能指针存储此类对象是可行的。然而,
当我将对象放入容器时,它不再编译:
error: no matching function for call to ‘Node::Node()’
有没有办法在没有默认构造函数的情况下将谷物转化为 store/restore 个对象向量?
我的测试代码:
#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;
}
据我了解这个库的工作方式,至少对于动态分配的对象,没有办法反序列化没有默认构造函数的东西。
其逻辑如下:
- 你需要反序列化
vector<Node>
- 为此,您需要分配适当数量的内存
- cereal不知道构造函数,不能自己正确分配对象内存
- 为了提供正确的对象构建,它需要默认构造函数
我正在尝试使用 Cereal 序列化一个没有默认构造函数的对象。直接或通过智能指针存储此类对象是可行的。然而, 当我将对象放入容器时,它不再编译:
error: no matching function for call to ‘Node::Node()’
有没有办法在没有默认构造函数的情况下将谷物转化为 store/restore 个对象向量?
我的测试代码:
#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;
}
据我了解这个库的工作方式,至少对于动态分配的对象,没有办法反序列化没有默认构造函数的东西。
其逻辑如下:
- 你需要反序列化
vector<Node>
- 为此,您需要分配适当数量的内存
- cereal不知道构造函数,不能自己正确分配对象内存
- 为了提供正确的对象构建,它需要默认构造函数