问题标签 [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 投票
0 回答
419 浏览

c++ - 将序列化数据传递到套接字时出现分段错误和内存泄漏

我正在玩弄ZeroMQCerealstd::vector在不同进程之间传递数据结构(主要是数字类型)。我已经成功地实现了我想要的,但是在执行结束时出现了分段错误,经过进一步检查后,valgrind我注意到内存正在泄漏/未释放。

server.cpp(接收方):

client.cpp(发送方):

的输出valgrind此 Pastebin 链接上。显然, zmq::socket_t由于Invalid read of size 4关闭套接字时,槽的析构函数会出现段错误。此外,调用时有很多Conditional jump or move depends on uninitialised value(s)报告。valgrindmemcpy

我的代码中到底缺少什么?还是图书馆内部代码的问题?

0 投票
1 回答
885 浏览

c++ - Cereal/C++ 11 - 如何指定反序列化的可选参数

我有一个用标准函数反序列化的类:

但就我而言parameter_4,并且parameter_5是可选的。

它们可能在也可能不在输入 JSON 字符串中。

当我试图反序列化这种缺少一些参数的不完整 JSON 时,我得到 Cereal“错误”——找不到那些缺少的参数。

有什么方法可以指定某些参数是可选的,并且在它们不属于 JSON 默认值的情况下将被使用?

0 投票
1 回答
43 浏览

c++ - 在使用 Cereal 序列化库时设置我可以在序列化函数中访问的属性

我正在使用“谷物”序列化库 (uscilab.github.io/cereal/) 来序列化可以包含数百万个数字的对象以及描述这些数字的元数据。在某些情况下,我不需要序列化数字,只需要元数据;其他时候,我希望两者都在档案中。

我能想到的唯一方法是将布尔属性添加到谷物.hpp 文件中定义的 OutputArchive 类。我的想法是,当我构建档案时,我设置了这个值。然后,当序列化代码运行时,任何对象都可以访问此属性并序列化适当的值。大多数对象会忽略此属性,但根据此属性的值,持有(可能)数百万个数字的对象可以忽略或不忽略这些数字。

这里有一些伪代码来帮助解释(来自 Cereal 网站上的示例)。创建存档如下所示:

然后,在序列化我的数据对象(包含元数据和数百万个数字的对象)的函数中:

我的问题:

1)我对这一切都错了吗?我错过了一种更简单更优雅的方式吗?

2)如果不是,这似乎是合理的,我不确定如何通过“Archive&”参数访问我在 OutputArchive 中的属性,该参数被传递到 Cereal 序列化所需的模板函数中。

提前感谢您的帮助。

0 投票
1 回答
633 浏览

c++ - 谷物序列化 CString 向量

EDIT:// 得到它的工作感谢下面的答案,添加当前工作的代码和测试用例以防万一有人发现它有用。

下面是我用来测试的代码,它正确输出了向量的所有元素。

感谢 Barmak Shemirani 的帮助。

0 投票
2 回答
493 浏览

c++ - Cereal 中的序列化和继承

我希望我的程序在 JSON 文件中保存和读取配置结构。

但是,我在生成正确的 JSON 文件时遇到了问题。可能问题是继承。

JSON 输出(不正确):

预期(正确)JSON:

代码 :

具有公共元素的基本结构

两种具体结构

Main:测试保存到json文件

0 投票
1 回答
232 浏览

c++ - 在 C++ 中使用 POCO 和谷物反序列化多个对象

我正在尝试使用 POCO::Net 通过网络将一些对象从一个程序发送到另一个程序来处理连接,并使用谷物来处理序列化。

所有数据包都继承自单个基础 BasePacket。

这就是我发送数据的方式:

这就是我接收数据的方式:

问题是当数据发送非常快时,许多数据包可能在套接字缓冲区中等待,并且谷物读取所有字节,但仅反序列化第一个数据包而其余数据包丢失。

有没有办法让谷物当时只读取一个数据包或反序列化多个数据包?或者我应该在 Poco 的 socketstream 和谷物的存档之间建立某种缓冲区来发送数据大小,以便它可以在将一个数据包传递给谷物之前同时读取一个数据包?

0 投票
1 回答
1205 浏览

c++ - C++ 谷物保存/load_and_construct 不工作

因此,我正在尝试使用Cereal库,但遇到了一个似乎无法克服的问题。基本上,文档说可以反序列化没有默认构造函数的类型。然而在实现说明中它说Define a serialize or save/load pair as you normally would如果没有默认构造函数,则无法以有效方式定义序列化/加载选项。我的意思是,该load_and_construct函数取代了load. 然而,当实现下面看到的一个相对简单的例子时。

“主.cpp”

这段代码显然有点毫无意义,它只是一个最小的例子来说明我遇到的问题。

0 投票
2 回答
1150 浏览

c++ - 谷物多态序列化找不到序列化函数

我目前正在尝试使用静态函数创建一个可序列化的基类,以序列化和反序列化派生类对象。我已阅读 Cereal Documentation for registering Polymorphic Relations 以及如何注册类型以及如何声明序列化函数。目标是像这样使用 Serializable :

我正在使用 Visual Studio 平台工具 2017(v141)。目标 Windows SDK 是 10.0.17134.0

但我无法构建我的应用程序并得到这 2 个错误 3 倍:

这是我的代码:

可序列化的.hpp 可序列化的.cpp 测试对象.hpp 测试对象.cpp 主文件

这是完整的构建错误:

0 投票
0 回答
363 浏览

c++ - Cereal 似乎对从未序列化的基类很挑剔

我减少了一个人为的(最小的)示例。

第 1 步是拥有一个带有枚举“种类”字段的基本类型,该字段必须由派生构造函数填充。请注意,没有理由为 BodyPart 使用序列化程序,因为非默认构造函数会对其进行初始化。

我们必须有一个虚拟析构函数,因为我们要创建 shared_ptr 并传递它,并且我们要确保我们不执行切片 ~BodyPart。

步骤#2,添加一个带有一些实际数据的派生类

步骤#3,执行所需的注册

步骤#4,谷物化:

戳了一会儿,似乎没有任何其他方法可以“说服”谷物我不想直接序列化(谷物化?)BodyPart。我找到了两个可行的解决方案

  1. 在基类中添加一个伪纯虚函数,然后在所有派生类中定义它。显然这是愚蠢的,而不是我要在真实代码中做的事情。也不兼容非侵入式方法。

  2. 更好的版本 1,创建一个额外的类来定义覆盖,这样它就不会污染派生类。仍然非常具有侵入性。

  3. 做我上面做的事情,并为基类添加运行时错误的 Cereal 函数(在实际代码中,我会抛出 std::logic_error 或其他东西)。

我想最好的是:

  1. Cereal 神奇地做了正确的事情,并推迟寻找基类序列化函数,直到我实际序列化它。这是不可能的,因为反序列化的翻译单元对序列化的内容一无所知(可能在任何地方)。必须以某种方式将这些知识注入到输出存档中。

[ 呵呵,有时候写出来会让你相信答案,嗯?]

  1. 一种强制 Cereal 将类视为抽象基类的显式方法,即使它不是。查看 polymorphic.hpp,很少有使用 std::is_abstract 的地方。可以(?)添加一个谷物::is_abstract 类型特征,客户可以使用它来注入一个类永远不会直接反序列化的知识。

无论如何,这是 TLDR 的方式,感谢您阅读到这里。请告诉我我是不是疯了,或者我是否至少以一种明智的方式定义了“问题空间”。

0 投票
1 回答
366 浏览

c++ - 在 C++ 谷物库中正确使用 CEREAL_REGISTER_DYNAMIC_INIT 问题

我已经开始使用 lib 文件并希望正确使用 CEREAL_REGISTER_DYNAMIC_INIT。我不知道我是否需要使用它,但我注意到我的一种谷物化类型没有在单独的 DLL 中正确提取的问题,我认为这可能会有所帮助。

在 accountActions.h 我在文件末尾有以下内容:

在 accountActions.cpp 我在文件顶部附近有以下内容:

假设 mv_accountactions 只是一个完全组成的字符串。我没有任何命名的库或 dll,但认为它用于将这两个单元链接在一起?文档很少,我可能使用不正确。

我得到的错误是:

1> c:\git\bindstone\source\game\networklayer\accountactions.cpp(13): error C2084: function 'void grain::detail::dynamic_init_dummy_mv_accountactions(void)' has a body 1> c:\git\ bindstone\source\game\networklayer\accountactions.h(127):注意:参见“dynamic_init_dummy_mv_accountactions”的先前定义

我已经仔细检查过,并且没有在其他任何地方使用 mv_accountactions ......我不知道是什么可能导致此问题或如何解决它。我想知道我是否甚至需要 CEREAL_REGISTER_DYNAMIC_INIT,或者是否有一种安全的方法可以使用它,以防我确实移动到 DLL 并且我只是在滥用它。

建议将不胜感激。

问题在这里打开:https ://github.com/USCiLab/cereal/issues/523