- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我正在尝试使用 Cereal图书馆,我遇到了一个我似乎无法克服的问题。本质上,文档说可以反序列化 Types with no default constructor .然而在实现说明中它说 像往常一样定义序列化或保存/加载对
但是如果没有默认构造函数,则不能以有效方式定义序列化/加载选项。我的意思是,load_and_construct
函数取代了 load
。然而,当实现一个相对简单的示例时,如下所示。
“ main.cpp ”
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <memory>
#include <cereal/access.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/vector.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/archives/portable_binary.hpp>
struct string_wrapper {
const std::string str;
string_wrapper(const std::string& _a) : str{_a} {}
template <class Archive>
void save(Archive& _archive) const {
_archive(str);
}
template <class Archive>
static void load_and_construct(Archive& _archive,
cereal::construct<string_wrapper>& _construct) {
std::string a;
_archive(a);
_construct(a);
}
};
struct wrapper_of_string_wrappers {
const std::vector<string_wrapper> strs;
wrapper_of_string_wrappers(
const std::vector<string_wrapper>& _a
) : strs{_a} { }
template <class Archive>
void save(Archive& _archive) const {
_archive(strs);
}
template <class Archive>
static void load_and_construct(Archive& _archive,
cereal::construct<wrapper_of_string_wrappers>& _construct) {
std::vector<string_wrapper> strs;
_archive(strs);
_construct(strs);
}
};
int main() {
auto file = "test.bin";
{ // save
std::ofstream os(file, std::ios::binary);
cereal::PortableBinaryOutputArchive archiveSave(os);
std::vector<string_wrapper> as;
as.push_back({"Hello"});
as.push_back({"World"});
wrapper_of_string_wrappers test(as);
auto test_ptr = std::make_unique<wrapper_of_string_wrappers>(test);
archiveSave(test_ptr);
}
{ // load
std::ifstream is(file, std::ios::binary);
cereal::PortableBinaryInputArchive archiveLoad(is);
std::unique_ptr<wrapper_of_string_wrappers> test = nullptr;
archiveLoad(test);
std::cout << (*test).strs[0].str << " " << (*test).strs[1].str << std::endl;
}
std::cin.get();
return 0;
}
这段代码显然有点毫无意义,它只是一个说明我遇到的问题的最小示例。
最佳答案
来自 this page
Non-default constructors are currently only supported for serializing pointers
你的问题是你试图在没有默认构造函数的情况下序列化非指针值
std::vector<string_wrapper> strs;
_archive(strs);
要解决您的问题,您需要使用 save/load
对为 string_wrapper
创建默认构造函数,或者使用 string_wrapper
作为 中的指针wrapper_of_string_wrappers
.
这是第二个选项的工作代码(string_wrapper
保持不变):
struct wrapper_of_string_wrappers {
//const std::vector<std::unique_ptr<string_wrapper>> strs;
//const string_wrapper strs;
const std::unique_ptr<string_wrapper> strs;
wrapper_of_string_wrappers(
//const std::vector<std::unique_ptr<string_wrapper>>& _a
const string_wrapper _a
) : strs{ new string_wrapper(_a) } { }
wrapper_of_string_wrappers(
const wrapper_of_string_wrappers& w
) : strs{ new string_wrapper(*w.strs) } { }
template <class Archive>
void save(Archive& _archive) const {
_archive(strs);
}
template <class Archive>
static void load_and_construct(Archive& _archive,
cereal::construct<wrapper_of_string_wrappers>& _construct) {
//std::vector<std::unique_ptr<string_wrapper>> strs;
std::unique_ptr<string_wrapper> strs;
_archive(strs);
_construct(*strs);
}
};
int main() {
auto file = "test.bin";
{ // save
std::ofstream os(file, std::ios::binary);
cereal::PortableBinaryOutputArchive archiveSave(os);
string_wrapper as("Hello");
wrapper_of_string_wrappers test(as);
auto test_ptr = std::make_unique<wrapper_of_string_wrappers>(test);
archiveSave(test_ptr);
}
{ // load
std::ifstream is(file, std::ios::binary);
cereal::PortableBinaryInputArchive archiveLoad(is);
std::unique_ptr<wrapper_of_string_wrappers> test = nullptr;
archiveLoad(test);
std::cout << (*test).strs->str << std::endl;
}
std::cin.get();
return 0;
}
关于C++ Cereal save/load_and_construct 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51530564/
我正在尝试使用图像处理工具(如Python中的OpenCV)将颗粒分类为有缺陷的和无缺陷的。图像之一如图所示。 我首先通过使用HSV空间进行测距来分别对 Cereal 进行分割,并应用了一些边缘检测算
我知道在 Haskell 中序列化和反序列化数据的两个主要竞争包是二进制和谷类。什么时候应该选择其中一个包而不是另一个包?还是我忽略了其他选择? 最佳答案 它们不是竞争,它们是互补的。 cereal在
我正在尝试在笔记本电脑中运行grails,已经安装了jdk 1.8.0和jre8,我已经正确设置了JAVA_HOME和GRAILS_HOME。当我在命令提示符下键入%JAVA_HOME%或%GRAIL
我有一个现有的域, Controller , View (为后者自动生成),可以在浏览器中正常工作。 如果我具有... / user / show / 1或... / user / show的URL,
我有一个grails项目,当我提交它并将其推送到bitbucket远程时,在我注意到的bitbucket中,没有推送taglib,utils,services文件夹。问题是什么?该文件夹中没有文件。但
几个星期以来一直是一个问题,没有人设法解决这个问题。 当我填充数据库时,我通过读取并解析一个Excel工作表来做到这一点。 为每条线创建一个产品 域: class Product { St
我正在尝试将OpenRDF Sesame的核心库导入Grails应用程序。 这是我的BuildConfig.groovy文件的摘录: repositories { inherits true
我在Grails应用程序中有两个域,具有一对多关系:Course和Person。一门类(class)可能有很多人。当我查看针对类(class)的show.gsp时,它将显示该类(class)注册的所有
我有一个关于在Java脚本函数中使用remoteFunction组件的问题;我正在使用Grails 1.3.7。 我的页面上有几个div,其中包含我要更新的div。我要更新的每个div都有自己的ID(
我正在使用Grails -2.0.1,并且尝试运行应用程序时,我发现了NoClassDefFoundError: 错误2012-10-16 15:24:25,301 [http-bio-8080-ex
我发现了一个特定的 100MB bin 文件(在最小示例中为 CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin),其中 Cereal 无法加载抛
我应该如何继续序列化嵌套对象? 例子: class B { public: int y; template void serialize(Archive& ar) {
我不知道为什么在尝试编译时会出现此错误。我尝试添加几乎所有类型。我正在尝试序列化一组 RegDoneEntry 的 .我知道序列化的调用不在这里,但我不能超越这个。以下内容已更新以反射(reflect
我对 Cereal 很陌生,我有一个(可能很简单的)问题: 当我不知道 (XML) 存档中的对象数量时,有没有办法反序列化多个对象? 我试过类似的方法: std::ifstream is("c:\\d
我在 VS 2013 中使用 Cereal 1.1.2。 我已经尝试使用此处的类型进行存档特化的示例:http://uscilab.github.io/cereal/archive_specializ
我在序列化多态类型时遇到问题。实际上,我只是将示例拆分为:http://uscilab.github.io/cereal/polymorphism.html在几个文件中。它编译得很好但在运行时我得到一
编辑:问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很误导
好吧,我在 C++11 中遇到了 Cereal 问题 (http://uscilab.github.io/cereal/)。 在抽象意义上,我有一个大图,我正在用许多连接边和顶点的共享指针对其进行序列
我在几种序列化协议(protocol)之间做了一些性能比较,包括FlatBuffers,Cap'n Proto,Boost序列化和谷类。所有测试都是用C++编写的。 我知道FlatBuffers和Ca
我试图遍历索引 View 中的字段列表。可以说我将以下内容传递给index.gsp: [SomeDomainList: SomeDomain.list(), fields: ['field1', 'f
我是一名优秀的程序员,十分优秀!