问题标签 [cereal]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
156 浏览

c++ - 如何使用cerial序列化

我试图弄清楚 Cereal 序列化是如何工作的,所以我阅读了文档(我发现它有点缺乏 imo)并试图重现他们在那里的代码:

我直接从 Cereal 的文档中复制了代码,但我不断收到错误消息:

type 'cereal::BinaryInputArchive' does not provide a call operator

0 投票
0 回答
112 浏览

c++ - 使用谷物使用 const 键反序列化 sparsepp sparse_hash_map

我正在尝试使用 grain 序列化和反序列sparsepp spp::sparse_hash_map类型。spp::sparse_hash_map<const std::vector<uint32_t>, uint32_t>

请参阅有关我为什么在此处const使用密钥的相关问题。

但是,以下代码的编译失败:

当我从键类型中删除 const 时,它会编译:

编译器的输出:

编译器:clang 版本 6.0.0-1ubuntu2 (tags/RELEASE_600/final)

有没有办法使用谷物来消除这种类型?我错过了什么?

0 投票
1 回答
309 浏览

c++11 - 带有动态库的 std::chrono 的谷物序列化问题

我对谷物库(http://uscilab.github.io/cereal/)有疑问。

我有一个共享库,我想使用谷类库序列化它的一个类。它有一个来自 std::chrono 的 time_point 成员

这是我在 Event.h 中的对象的一部分代码

该库编译没有问题。然后我想在我尝试序列化对象之一的可执行文件中使用我的库:

此代码无法编译,它抱怨缺少 time_point 的序列化函数。如果我打算只序列化它编译的字符串。

构建错误输出:

编辑:

我想问题出在共享库中定义了序列化函数这一事实。

如果我只是编译一个具有 time_point 的测试类(不是在我的项目中只是为了测试),它会按预期工作。

0 投票
0 回答
329 浏览

c++ - 谷物序列化 shared_ptr 的问题

我在用 Cereal 序列化共享指针时遇到了问题。我有以下类结构:

};

通过运行我的主代码,我得到以下输出:

SN:(l_32)EN:(l_32)ENP:0x7f9f90001450

SN:(l_13)EN:(l_13)ENP:0x7f9f90001b80

SN:(l_4)EN:(l_4)ENP:0x7f9f90002100

SN:(l_58)EN:(l_58)ENP:0x7f9f90002280

SN:(l_27)EN:(l_27)ENP:0x7f9f90002340

SN:(l_81)EN:(l_81)ENP:0x7f9f900028b0

SN:(l_65)EN:(l_65)ENP:0x7f9f90002970

SN:(l_49)EN:(l_49)ENP:0x7f9f90003140

SN:(l_73)EN:(l_73)ENP:0x7f9f90003200

SN:(l_99)EN:(l_99)ENP:0x7f9f900032c0

SN:(l_33)EN:(l_33)ENP:0x7f9f90003380

SN:(l_14)EN:(l_14)ENP:0x7f9f90002af0

CN: (l_5) ENP: 0x7f9f90001510

看起来对于事件(l_5),它没有序列化共享指针。根据 Cereal 的文档,如果共享指针已经序列化,就会发生这种情况。通过打印出地址,我可以得出结论,情况并非如此。

您能否提一些建议?

0 投票
1 回答
133 浏览

c++ - 谷物编译并运行,但不写入文件

以下代码不写入文件。

它显然可以正确编译和运行。

如果我们cout << s << endl;超出范围,我们会在控制台中看到:

少了什么东西?

0 投票
0 回答
267 浏览

c++ - 包含其他结构的向量的结构的序列化失败

我正在为一个类做一个最终项目,并试图使用谷物库来序列化一个结构,该结构包含另一个类型结构的向量向量,但这是失败的。另一种(包含在向量中)类型的结构具有有效的序列化功能(经过测试)。当我尝试序列化和反序列化容器结构时,我收到错误“无法从输入流中读取 8 个字节!读取 0”

我已经成功地序列化了另一个包含结构向量向量的结构,所以我知道这应该是可能的。当我这样做时,向量中结构中的所有字符串都可以在我保存输出的文件中看到。但是,当我为这个项目序列化容器结构时,生成的文件只包含容器类中向量的第一个子向量中的前两个内部结构的字符串。(例如:包含 struct.vec[0][0].string 和 struct.vec[0][1].string,但不包含其他 14 个)。

在包含容器结构的文件的顶部,我有

它具有以下成员变量(此处重命名)。Region 是一个具有工作序列化功能的结构。:

容器的(Country)序列化函数:

这是产生错误的代码:

我希望用谷物创造的国家与我后来创造的国家相同,但事实并非如此。它不包含任何变量,并且 Catch2 提供了错误“无法从输入流中读取 4 个字节!读取 0”

0 投票
1 回答
431 浏览

c++ - std::string_view 的自定义序列化导致意外的编译器错误

我已经在github上问过这个问题(大约一个月前),没有任何答案,所以我现在在这里问。

我在我的项目中使用 Cereal 作为序列化库。我尝试为std::string_view(基本上是从std::string实现中复制和粘贴)添加序列化功能。但是,Cereal 会引发编译器错误:

谷物找不到提供的类型和存档组合的任何输出序列化函数。

这是我的实现(我在这里禁用了反序列化,但我也尝试了一个虚拟函数,它给了我相同的结果):

最小的例子:

测试成功编译并通过了二进制存档,但不适用于 XML 和 JSON 序列化。

我认为这与enable_ifcondition中的特征有关is_output_serializable<BinaryData<CharT>, Archive>,但该特征也存在于std::string实现中并且工作得很好。我也找不到std::string.

为什么我会收到 XML 和 JSON 档案的编译器错误?

0 投票
1 回答
280 浏览

c++ - 如何序列化 unique_ptr指导

我找不到任何关于如何将 unique_ptr 序列化为数组的文档。任何帮助都会很棒。

它是如何分配的。

0 投票
0 回答
145 浏览

c++ - 无法确定 rapidjson 类型/难以阅读三重嵌套字符串

我正在尝试使用谷物来反序列化 JSON 消息。(当前)消息结构如下:

最重要的数据是“Q”。我可以轻松读取所有正常字符串。我能够轻松阅读顶级项目。我最终能够通过将“C”视为一个数组来读取“D”-“I”(尽管缺少“[”和“]”)。但是,我无法将“N”归档为字符串、数组、向量或对象。它只是使相应的 IsString()、IsObject() 等检查失败iarchive(C);。我看到 a GetType(),但我不知道在 "N" 上调用它,因为我尝试用 "N" 做的任何事情都失败了。

然后我能够将字符串分解为

太好了,所以只是“C”,但更简单。不幸的是,我遇到了和以前一样的问题。

然后我将其分解为 {"P":"Q"} 并最终能够通过以下方式获得 Q 的值iarchive(value)

如果我添加,CEREAL_NVP(variables)到带有箭头的行,我会得到以下输出:

明确地说,我得到了我想要的结果,Q。我只是觉得必须有更好的方法。我觉得问题的根源在于我无法确定 N 是什么类型。由于我不知道类型,我不知道如何正确地将其归档在麦片中。在使用 rapidjson 的 C++11 和谷物领域内,我能做些什么更好?

我想知道是不是因为“O”在字符串中间有一个数字,所以把它扔掉了。我不希望因为这是我相信的有效字符串

编辑:我忘了提到“O”可以改变。所以我将无法对其进行硬编码doc["N"]["O"]["P"]

0 投票
1 回答
497 浏览

c++ - 可以使用 Cereal 重新创建 Protobuf 的 oneof 反序列化功能吗?

我能够编写代码来反序列化包含 oneof 部分的原始消息,而无需事先知道 oneof 部分包含什么。我不知道如何编写一组类似的结构定义,我可以使用 Cereal 以相同的方式反序列化。

我正在使用 Protobufs 序列化/反序列化一些数据,但遇到了与 piaoxu 相同的问题。所以我改用谷物。

我已经能够将所有原始原型定义转换为可以使用 Cereal 序列化的 C++ 结构定义,但使用 oneof 功能的原型定义除外。

这是我想转换为结构的原型定义的示例集:

这是我为反序列化和解析接收到的Message. 使用生成的 protobuf 代码,我能够反序列化 aMessage而无需先知道它是否包含 anA或 a B

这是我尝试制作一组​​等效的结构定义:

我正在使用这些结构来序列化并发送如下消息:

这种方法一直有效,直到我尝试反序列化收到的Message. 我希望能够在Message 首先知道它是否包含 aA或 a的情况下反序列化它B,但 AFAIK 这是不可能的。

使用我目前的方法确实不可能吗?如果是这样,是否有另一种方法可以让我在不知道它包含什么的情况下反序列化一组类似的结构?