问题标签 [boost-serialization]

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 回答
172 浏览

boost - 如何获取文件名 boost::archive 正在保存/加载到

我想知道如何从存档中获取文件名字符串,在序列化函数或任何其他具有template<class archive>语法的函数中。

谢谢!=)

0 投票
1 回答
550 浏览

c++ - 在 boost 中使用 polymorphic_text_archive 序列化一个 original_type 类

我正在尝试测试以下示例代码,它解释了如何在 boost 中序列化用户定义的原始类型类,它工作正常。但是如果我切换到我必须在我的项目中使用的 polymorphic_archive(使用 polymorphic_text_* 测试),它无法编译,我正在努力修复它(在 vc++2008 中测试)。

所有代码都可以在以下 3 个链接中找到:http://www.boost.org/doc/libs/1_46_1/libs/serialization/test/test_primitive.cpp http://www.boost.org/doc/libs /1_46_1/libs/serialization/test/test_tools.hpp和 libs/1_46_1/libs/serialization/test/text_archive.hpp

请将 text_archive.hpp 中的 headers 和 typedefs 更改为多态的,如下所示:

使用的预处理器标志:

BOOST_ALL_DYN_LINK;BOOST_FILESYSTEM_NO_DEPRECATED;BOOST_FILESYSTEM_VERSION=3

错误信息:

------ 构建开始:项目:TestSer4,配置:调试 Win32 ------正在
编译...
test_primitive.cpp
c:\program files\boost\boost_1_46_1\boost\archive\detail\oserializer.hpp( 88) : 错误 C2664: 'void boost::archive::polymorphic_oarchive_impl::save(const bool)' : 无法
将参数 1 从 'const A' 转换为 'const bool'
没有可以执行此操作的用户定义转换运算符转换,
或者不能调用操作符
c:\program files\boost\boost_1_46_1\boost\archive\detail\oserializer.hpp(232) :参见函数模板实例化的参考 'void boost::archive::save_access::save_primitive(存档 &,const T &)'

[编译
Archive=boost::archive::polymorphic_oarchive,
T=A
]
c:\program files\boost\boost_1_46_1\boost\archive\detail\oserializer.hpp(308) :参见对函数模板实例化的参考 'void boost::archive: :detail::save_non_pointer_type::save_primitive::invoke(Archive &,const T &)' 正在编译
[
Archive
=boost::archive::polymorphic_oarchive,
T=A
]
c:\program files\boost\boost_1_46_1\boost\ archive\detail\oserializer.hpp(525) : 参见函数模板实例化的参考 'void boost::archive::detail::save_non_pointer_type::invoke(Archive &,const T &)' 被
编译
[
Archive=boost::archive::polymorphic_oarchive,
T=A
]
c:\program files\boost\boost_1_46_1\boost\archive\polymorphic_oarchive.hpp(122) :参见对函数模板实例化 'void boost::archive:: 的引用save(Archive &,T &)' 正在
使用
[
Archive=boost::archive::polymorphic_oarchive,
T=A
]
c:\program files\boost\boost_1_46_1\boost\archive\detail\interface_oarchive.hpp(63) 编译:请参阅正在编译的函数模板实例化 'void boost::archive::polymorphic_oarchive_impl::save_override(const boost::serialization::nvp &,int)' 的
参考
[
T=A
]
c:\program files\boost\boost_1_46_1 \boost\archive\detail\polymorphic_oarchive_route.hpp(171) : 参见函数模板实例化'Archive &boost::archive::detail::interface_oarchive::operator < <(T &)'
使用
[
Archive=boost::archive::polymorphic_oarchive,
T=const boost::serialization::nvp
]
c:\apps\proj\serilization\testser4\testser4\test_primitive.cpp(73) 编译:参见函数模板实例化的参考 'boost::archive::polymorphic_oarchive &boost::archive::detail::polymorphic_oarchive_route::operator <<>(const boost::serialization::nvp &)'正在编译
使用
[
ArchiveImplementation=boost::archive::text_oarchive_impl,
T=A
]
构建日志保存在“file://C:\apps\proj\Serilization\BusSchedEx\BusSchedEx\Debug\BuildLog.htm”
TestSer4 - 1 错误( s), 0 个警告
========== 构建:0 个成功,1 个失败,0 个最新,0 个跳过 ==========

请帮忙。

0 投票
1 回答
284 浏览

c++ - Boost.Serialization:序列化过程中调用类方法时出错

在序列化过程中尝试调用“TestSerialize”类中的方法时出现以下问题。

这是我的代码:

我遇到的错误是:“TestSerialize::GetVal”:无法将“this”指针从“const TestSerialize”转换为“TestSerialize &”

此错误仅发生在“保存”而不是“加载”

我想知道为什么我会收到这个错误。我想知道 Boost.Serialization 做了什么使我们有这两种不同的行为。我使用 Boost 库 1.47.0

0 投票
1 回答
1440 浏览

c++ - Boost 序列化加载失败并引发异常

很长一段时间以来,我一直在努力完成这项工作。

在我的项目中,通过实现模板函数序列化,使用 boost 中的确切教程对 6 个类进行了序列化。

这些类是:State、guState、Policy、Action、Param、Vec3D。

当我序列化并保存它们时,它工作正常。我确实得到了一个文本文件,其中包含各种数字和字符串。

没有抱怨,没有警告,没有抛出异常。唯一的情况是,如果我尝试序列化一个类的指针成员,空洞进程就会变成僵尸。所以我不尝试这样做,并保存作品。

但是,当我尝试加载时,我得到:

抛出'boost::archive::archive_exception'的实例后调用终止what():流错误

现在有趣的部分是我序列化了两个 boost::ptr_vector,一个由 State 指针组成,一个由 Policy 指针组成。

状态向量,我保存并加载没有问题。策略向量,我可以保存,但是当我尝试加载时,我得到了异常。

此外,在阅读了 boost 教程之后,我的印象是,为了加载,除了 serialize 函数之外,我不需要其他任何东西。

但是,当我尝试加载时,boost 序列化会抱怨找不到默认构造函数,例如 State()、Policy() 等(我在每个类中实现自己的构造函数)。

在这里阅读本教程后,我实现了一个默认构造函数,它什么都不做,因此 boost-serialization 可以工作。确实它确实编译了,我得到了上面提到的结果。

我已经尝试走一条非常复杂的道路,在我的旧问题中看到,我尝试分离和实现 save_construct_data 和 load_construct_data,但我发现这太麻烦了,我又得到了上面的确切错误。

有人可以帮我解释一下加载是如何工作的,默认构造函数是怎么回事?或者至少给我指出一个可能有帮助的链接。我已经浏览了boost的手册,它们对重建的解释不多。

谢谢你。

编辑(添加了一些片段)

其他继承自 State 的类也有它们的序列化函数,使用:

班级政策:

如您所见,这是两个主要类,其他类也由于重构依赖关系而被序列化(类 Action、类 Param 等)

大师班:

有效地包含保存状态和策略的两个 boost::ptr_vectors。状态被保存和加载没有问题。

加载策略时会出现问题。保存它们似乎不会造成问题(但我可能又错了)。

在没有策略和有策略的情况下测试了保存/加载,问题似乎与策略重建有关。

请注意仅由序列化使用的默认构造函数,否则代码将无法编译。

编辑#2:使用 valgrind 和 memcheck 运行应用程序后,它报告存在指针内存泄漏。但是,由于我不擅长使用 valgrind 进行调试,所以我无法真正判断泄漏发生在哪里,或者它是否与我的序列化相关(我认为是)。

0 投票
2 回答
3280 浏览

c++ - Boost.Serialization 和 Boost.Python 双向泡菜

我有一个使用 Boost.Serialization 的 C++ 库。我正在使用 Boost.Python 为这个库创建 Python 绑定。很清楚如何为使用 Boost.Serialization 的 Boost.Python 制作一个 pickle 套件(使用 Boost.Serialization 保存到字符串,然后将该字符串返回给 Python)。

我想要的是相反的:给定 a boost::python::object,我想要一个serialize(...)函数来调用 Python 的pickle.dumps()函数并序列化生成的字符串。(想象一下std::vector<boost::python::object>。当我序列化这个向量时,Boost.Serialization 会调用辅助serialize()函数。)这可能吗?更好的是,是否可以使用cPickle和绕过将控制权交给 Python 解释器?

0 投票
1 回答
233 浏览

progress - boost序列化的进度指示器

我有一个使用 boost 序列化实现的文档结构,但是当我保存/加载文档时可能需要很长时间。我需要了解保存/加载的进度。

有没有办法为此使用 boost iostreams 源?这样我就可以实现一个从我的输入流中获取数据的源。

更多想法?

0 投票
2 回答
4049 浏览

c++ - LevelDB 与 std::map

在我们的应用程序中,我们使用std::map存储(键、值)数据并使用序列化将数据存储在磁盘上。通过这种方法,我们发现磁盘 I/O 是性能瓶颈,使用 key 查找值并不是很快。

我遇到了 LevelDB 并考虑使用它。但我有一些问题。

  1. LevelDB 的文档说它是为 (string, string) 键值对制作的。这是否意味着我不能用于自定义键值对?
  2. 似乎std::map和 LevelDB 之间的区别在于 LevelDB 是持久的并且std::map在内存中工作。那么这是否意味着磁盘 I/O 瓶颈对于 levelDB 来说会更成问题。

更具体地说,有人可以解释一下 LevelDB 是否是更好的选择std::map吗?

PS:我尝试使用hash_maps 但它似乎比std::map

0 投票
2 回答
1100 浏览

c++ - boost序列化的编译错误

我创建了一个小样本来测试 boost 序列化库,但是我遇到了编译问题。

首先,这是代码:

我在以下行收到编译错误:

错误是:

operator>>不匹配'iixml >> boost::serialization::make_nvp(const char*, T&) [with T=MyClass(((MyClass&)(&d)))]'

你对这个的含义有任何想法吗?

0 投票
1 回答
910 浏览

c++ - 通过 sql server xml 数据类型提升与 xml 之间的序列化异常

好的,这是我的问题。

我有一个 boost 对象,它通过序列化创建 xml 字符串,这很好用。

使用升压版本 1.38

我把那个 xml 字符串保存到一个 sql server 数据库表中,变成一个 xml 数据类型,这也可以正常工作。

然后我从数据库表中检索我的 xml 字符串,但格式从插入时略有变化,基本上空白值已被短标记,从<data></data><data/>

这是之前和之后的xml示例。

这也很好,完全可以接受,并不意外。

当我使用这个 xml 字符串并尝试将 xml 序列化回 boost 对象时,问题就出现了,当它遇到 xml 字符串中的短标记标签时,它会抛出异常。

我遇到了这个问题,不知道如何解决这个问题,并且在网上找不到任何关于这个问题的参考,所以任何帮助都将不胜感激。

:)

这是我的代码,它应该可以毫无问题地编译,您只需要填写 db 部分的空白:

网格.hpp

主文件

0 投票
2 回答
1400 浏览

c++ - 如何使用boost将(嵌套)映射序列化为变量?

我在一个类中声明了一个地图,如下所示:

而且我希望能够使用 boost 将它的映射序列化为一个变量。

这些示例似乎正在序列化整个类,我不需要这样做。他们也在写入文件,这对我来说似乎效率低下,因为我不需要将地图的状态存档到文件中,只需以以后可以恢复的方式表示它。

现在我有这个来保存地图:

这可以恢复它:

但它不起作用。谁能给我一些提示或告诉我如何序列化和恢复地图?

谢谢你。

编辑: 我已经更详细地更新了我的示例,并考虑了 K-ballo 和 Karl Knechtel 的答案(谢谢!)。这已经解决了几乎所有的错误,除了一个错误,这是上面注释行中的 boost 序列化静态警告。警告是:

知道如何解决此警告以便编译吗?谢谢!

编辑: 我的问题是双重的:我需要添加: BOOST_CLASS_TRACKING(Example, track_never) 我正在序列化整个班级,并试图反序列化地图。