问题标签 [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.
c++ - C++11 谷物库无法序列化我的一个类
我正在使用谷物库,并尝试使用自定义构造函数获取派生类型的 shared_ptr 实例,以正确输入存档。我已经倾注了以下文档,但显然遗漏了一些东西。
以下是我的层次结构中的类:
这是我试图运行的测试代码:
我的“大小”类型确实可以正确序列化。我还包括谷物/types/memory.hpp、谷物/types/map.hpp、谷物/types/string.hpp 和谷物/types/base_class.hpp,但是当我尝试运行上面的 FileTextureDefinition 测试时,我得到了以下错误:
可以在 pastebin 上找到 textures.h 头文件的完整链接,但我已经包含了我认为相关的部分。
c++ - C++11 谷物:load_and_allocate 未正确加载
我正在使用谷物,一个 C++11 序列化库。我不确定这是库的错误还是我如何使用它的问题,我需要一些帮助。
鉴于以下对我自己的代码具有代表性(但不依赖于)的最小重现,我收到 JSONInputArchive::search 引发的异常,正如下面代码示例中我的评论旁边的行所调用的那样(//breaks here。)
我目前在这个 github repro 中提交436a0a275cda007f137876f37b4fc8783e615352(在撰写本文时,他们的开发分支的提示。)
我从上面得到的示例输出(在异常之前)是:
我已经修改了 throwing 方法(在 grain/archive/json.hpp 中)以打印它正在搜索的内容以及它正在查看的每个值以调试问题。这是我的修改版本:
上述方法的输出之前除外:
我从中得到的输出似乎表明搜索正在查看“test.ptr_wrapper”的成员而不是“test.ptr_wrapper.data”。
我的问题是:我做错了什么吗?还是麦片有问题?
c++ - Is there a way to specify a simpler JSON (de-)serialization for std::map using Cereal / C++?
The project I'm working on is a C++ application that manages a large number of custom hardware devices. The app has a socket/port interface for the client (like a GUI). Each device type has its own well-defined JSON schema and we can serialize those with Cereal just fine.
But the app also needs to parse inbound JSON requests from the client. One portion of the request specifies device filter parameters, roughly analogous to a SQL 'WHERE' clause in which all the expressions are ANDed together. E.g.:
This would indicate that the client wants to perform an operation on every "sensor" device with a "critical" status. On the surface, it seemed like the C++ implementation for the filter parameters would be a std::map. But when we experimented with using Cereal to deserialize the object it failed. And when we serialize a hard-coded filter map it looks like this:
Now I can understand why Cereal supports this kind of verbose serialization of map. After all, the key of a map could be a non-string type. But in this case the key is a string.
I'm not exactly keen on rewriting our interface spec and making our clients generate clearly non-idiomatic JSON just to satisfy Cereal. I'm new to Cereal and we're stuck on this point. Is there a way to tell Cereal to parse this filter as a std::map? Or maybe I'm asking it the wrong way. Is there some other stl container that we should be deserializing into?
c++ - 使用 ENet 从谷物发送二进制数据的 StringStream
几周以来,我一直致力于将 ENet 封装成一组易于使用的函数,但似乎有点问题。
我有一个 std::stringstream 并尝试使用 ENet 将内容发送到远程机器,然后在远程机器上重建 std::stringstream。
我需要使用 std::stringstream 的原因是因为我正在使用需要流的 Cereal Serialization Library 序列化我的数据。
在 Azoth 的帮助下,他确定我需要使用 std::istringstream 和 std::ostringstream。以前我只使用导致异常的 std::stringstream 。
然而,现在在便携式_binary.hpp 第 156 行的 Cereal 中引发了一个异常:
这就是我正在做的事情:
谷物便携式二进制数据存档被构造为保存单个向量。使用 ENet 将 std::ostringstream 发送到主机。
这部分似乎工作正常,我可以打印前后的信息,看起来是一样的,虽然有一些奇怪的符号,但它们在两端打印出来的都是一样的。
现在使用我们收到的数据在主机上创建一个 std::istringstream。
此时我在行收到异常:
我感觉数据在通过 ENet 发送时正在以某种方式发生变化和/或我没有正确地将数据从 std::ostringstream 中提取出来和/或没有正确地将数据放回 std::istringstream 中。
非常感谢您的宝贵时间,我非常感谢。
c++ - Cereal - 多重反序列化
我对谷物很陌生,我有一个(可能很简单)的问题:
当我不知道(XML)存档中的对象数量时,有没有办法反序列化多个对象?
我试过类似的东西:
假设我在 XML 文件中有 3 个对象,而我收到的 XML 没有包含对象编号。因此,在我的代码中,前 3 次迭代是可以的,但第 4 次生成“CerealTest.exe 中 0x0035395E 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000018。”
你有什么建议吗?
c++ - 使用 Cereal 库序列化 Eigen::Matrix
更新:在我四处搜索并阅读代码中的 doxygen 注释后,我设法让它工作。问题是我在使用resize()
方法之前错过了演员阵容,也没有std::ios::binary
用于流。如果您想做类似的事情,最好检查 Azoth 的答案。
我正在尝试Eigen::Matrix
使用 Cereal 序列化类型。这就是我所拥有的(大致基于https://gist.github.com/mtao/5798888和中的类型cereal/types
):
c++ - 使用 enable_shared_from_this 的谷物库错误
编辑:创建了一个最小的 VS 解决方案,以便更容易重现错误:https ://www.dropbox.com/s/pk0t8t2xykjmtc5/test%20cereal%20this.zip (添加谷物而不是 $(LIBSROOT) 我在其中有它)。
我收到 2 个错误,指出我没有默认构造函数:
但我认为类的默认构造函数应该没问题。如果我注释掉 Node 类变量的序列化,我会得到相同的错误,但使用 Part 类变量。
我有以下代码结构(省略了一些部分,如包含守卫或不相关的代码,如果需要,我当然可以提供整个内容,但我想使其尽可能短):
形状.h:
形状.cpp:
节点.h:
节点.cpp:
部分.h:
部分.cpp:
Contact 类包含一个 PartPtr 作为成员变量,PointCloud 只包含一堆 Eigen::Matrix 数据(也应该是一个智能指针,以加快代码速度,但这对于这个问题不应该很重要)。
任何建议如何解决这个问题?或者它可能是一个错误?我正在使用 VS2013,这也可能是原因。
c++ - 序列化模板化子类
非常感谢您的宝贵时间我真的很感激
有一个模板化的子类需要用 Cereal 序列化库进行序列化,基类是空的,它只存在所以我们可以有一个 shared_ptr 到基类的向量,允许它保存多种类型的模板化子类,有效地允许向量存储多种变量类型。
基类的以下向量被推入了一些子类:
最后,向量被序列化并发送到远程机器进行处理:
我一定错过了这个难题的关键部分,因为当我反序列化数据时程序会抛出异常,如果我调试输出变量的值是空白或大负数,这让我相信基类和/或子类不是正确序列化。
代码已被简化为仅暴露问题,有关完整想法的更多信息,您可以在此处参考此问题。
包括以下谷物标头:
当我开始将更多类型的数据添加到基类中时,我确信我需要更多。
如果有人知道这里发生了什么,我将不胜感激。
再次感谢您的宝贵时间。
windows - VS2013创建几个不同类的dll文件用麦片序列化
我试图将一些多态类拆分为一个 dll 文件。然后我得到一个未注册的多态类型的异常。问题似乎是代码创建了两个用于查找多态对象的映射实例(由模板类 grain::detail::StaticObject 保留)。如果我将 CEREAL_REGISTER_TYPE 放入进行序列化的项目中,那么一切正常。
所以我想知道是否有人知道是否可以做一些技巧来在 dll 文件中进行注册?
是否可以强制程序使用谷物::detail::StaticObject 类的相同实例?
c++ - 使用 Cerial 序列化数据并省略类型信息
是否可以在不序列化类型信息的情况下序列化数据?我问是因为我正在使用 Cereal 将数据序列化为数据包并通过网络发送它们,并且希望尽可能减少数据包大小,因此不包括类型信息会有所帮助。
我认为这是可能的唯一原因是,在发送端和接收端,应用程序已经知道类型信息以及序列化的顺序。
更容易准确地理解我如何从我的实际实现中序列化和反序列化数据:
网络包.h
网络包.cpp
从 NetPacket.h 中定义的 ReadData 和 WriteData 可以看出,要读取和写入数据,您需要在模板函数中指定类型信息。由于这个要求,类型信息在阅读器和作者端以及它的写入顺序是已知的。序列化数据时有什么方法可以省略类型信息?
对于这个大问题,我深表歉意,非常感谢您在这件事上花费的时间。