【发布时间】:2012-05-28 08:19:14
【问题描述】:
注意:
Boost 的归档方案基于对称的输入和输出归档类。一直写这两个都很乏味,所以我将使用?archive 来表示oarchive 和iarchive。
总结:
将我的自定义存档的基类从 binary_?archive_impl 更改为 text_?archive_impl 后,当编译器在我的其他类中实例化 serialize(...) 方法时,我的自定义存档类不再“找到”。
背景:
我的应用程序使用binary_?archive_impl 的子类成功地读取和写入文件到磁盘(文档和/或代码cmets 建议这样做而不是从binary_?archive 派生)。我需要从二进制文件格式切换到文本格式,因此我将自定义存档的基类切换为text_?archive_impl。就在那时,一切都爆发了。
问题:
我的自定义归档类添加了功能,包括一些在其 Boost 基类中不存在的附加方法;这些方法在我的许多课程中的serialize(...) 方法中被调用,并且它们运行良好。在将基类从binary_?archive_impl 更改为text_?archive_impl 后,我收到了到处都是编译错误,抱怨我的自定义方法在text_?archive 中不存在。嗯,这很明显(!!!),但它们确实存在在我的 custom 档案中,而且它们在我使用时正常 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”标头,一切正常。 (但我真的不想想修改我的 Boost 安装!)
3) 更仔细地查看这些标题并摆弄了一下,我发现如果我使用原始的、未修改的标题并注释掉该行
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
【问题讨论】:
标签: c++ visual-c++ serialization boost boost-serialization