c++ - 从 boost::archive::text_oarchive_impl 和 boost::archive::text_iarchive_impl 派生自定义存档类

标签 c++ visual-c++ serialization boost boost-serialization

注意:
Boost 的存档方案基于对称的输入和输出存档类。一直写这两者很乏味,所以我将使用 ?archive 来表示 oarchiveiarchive

总结:
将自定义存档的基类从 binary_?archive_impl 更改为 text_?archive_impl 后,当编译器实例化 时,我的自定义存档类不再“找到” >serialize(...) 我的其他类中的方法。

背景:
我的应用程序使用 binary_?archive_impl 的子类成功地读取和写入文件到磁盘(文档和/或代码注释建议这优于从 binary_?archive 派生)。我需要从二进制文件格式切换到文本格式,因此我将自定义存档的基类切换为 text_?archive_impl。那是一切都爆炸的时候。

问题:
我的自定义存档类添加了功能,包括一些在其 Boost 基类中不存在的附加方法;这些方法在我的许多类的 serialize(...) 方法中被调用,它们运行良好。将基类从 binary_?archive_impl 更改为 text_?archive_impl 后,我到处都收到编译错误,提示我的自定义方法不存在text_?archive 中。好吧,这很明显 (!!!),但它们确实存在在我的自定义文件中,并且当我使用时它们很好 Boost 的二进制基类。怎么回事?

我发现了什么,以及我的临时但不受欢迎的解决方案:
在撕掉我的头发并绕圈转了大约一天之后,这就是我发现的......

1) 前段时间(我相信是 Boost 1.34),文件“binary_?archive.hpp”被分成“binary_?archive_impl.hpp”和“binary_?archive.hpp”(后者 #include 前者).这不是对“text_?archive.hpp”完成的。 (因此,我将应用程序的 #include 行从“binary_?archive_impl.hpp”更改为简单的“text_?archive.hpp”。)

2) 如果我将“text_?archive.hpp”分成两部分并#include 仅包含“..._impl.hpp” header ,一切正常。 (但我真的不想修改我的 Boost 安装!)

3) 更仔细地查看这些 header 并稍微摆弄一下,我发现如果我使用原始的、未修改的 header 并注释掉该行

BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)

(对于 text_iarchive 也是如此),然后一切再次正常。 (顺便说一句,我自己的存档代码中有类似的行来“注册”我的自定义存档。)

谜团和我的困境:
A) 为什么这些线条的存在会扰乱作品? ...以及为什么删除它们会使事情正常进行? ...我这样做可能会(在不知不觉中)破坏什么?

B) 为什么很久以前“text_?archive.hpp”文件没有与“binary_?archive.hpp”文件分开? (图书馆坏了吗?应该修好吗?)

C) 有什么方法可以修改我的 Boost 安装来解决我的应用程序代码中的这个问题吗?

附言我正在使用 Boost 1.48 和 Visual Studio 2010(64 位)
P.P.S.我想以上所有内容同样适用于 text_w?archive

最佳答案

据我所知,它是 boost serialize 中的一个错误。我们会看到 here.

一)
1. 添加 BOOST_SERIALIZATION_REGISTER_ARCHIVE 和你的新存档不起作用,因为默认的文本存档已经注册 - 似乎只允许注册。
2. 删除它们使其工作,因为只有您的自定义类被注册。
3. 通过删除它们,您已经破坏了使用默认文本存档的能力 - 您的类(class)将被注册。

B)
我相当确定“text_?archive.hpp”文件应该像“binary_?archive.hpp”文件一样被拆分。补丁 boost 任何人?

C)
最好的解决方案是提交一个补丁来 boost 将文件分开。对于临时解决方案,最好的方法可能是将打过补丁的文件放在项目的本地,直到补丁进入 boost。

关于c++ - 从 boost::archive::text_oarchive_impl 和 boost::archive::text_iarchive_impl 派生自定义存档类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691911/

相关文章:

c++ - SDL2 和 GLFW3 : Loading Textures; Access Violation

c++ - 以下代码的符合 ISO C++ 标准的结果

c++ - 如何在 Visual C++ 2013 中执行嵌套的 initializer_lists

oop - 子类化 Avro 记录?

Java 序列化对象(如区域)

c++ - Zeromq:使用 Linux [REP] 和 Windows [REQ] 连接,没有消息到达

c++ - 来自 EPEL 的 Amazon Linux 上的 Clang 无法找到 C++ header 或库

.net - MySQL Workbench 5.2.42 在 Win7 x64 上启动时崩溃

c++ - 缺少 MSVCP100D.dll

c# - 使用 JsonConvert 进行序列化会丢失数据