从boost :: archive :: text_oarchive_impl和boost :: archive :: text_iarchive_impl派生自定义归档类

ald*_*ldo 10 c++ serialization boost boost-serialization visual-c++

注意:
Boost的归档方案基于对称的输入和输出归档类.一直写下这两个都很乏味,所以我会用它?archive来表示oarchiveiarchive.

总结:
从改变我的自定义档案的基类后binary_?archive_impltext_?archive_impl,我自定义的存档类不再是"发现"当编译器实例化serialize(...)我在其他类中的方法.

背景:
我的应用程序成功地使用子类binary_?archive_impl(文档和/或代码注释推荐此文件来源)读取和写入文件到磁盘binary_?archive.我需要从二进制文件格式切换到文本格式,因此我将自定义归档的基类切换为text_?archive_impl.一切都爆发了.

问题:
我的自定义归档类添加了功能,包括其Boost基类中不存在的一些其他方法; 这些方法在serialize(...)我的许多类中的方法中调用,并且它们工作正常.更改基类后binary_?archive_impltext_?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"标题,那么一切正常.(但我真的希望修改我的升压安装!)

3)仔细观察这些标题并摆弄一下,我发现如果我使用原始的,未经修改的标题并注释掉该行

BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
Run Code Online (Sandbox Code Playgroud)

(同样如此text_iarchive),然后一切正常.(顺便说一下,我在自己的存档代码中有类似的行来"注册"我的自定义存档.)

神秘和我的困境:
A)为什么这些线条的存在会污染作品?...为什么删除它们会让事情发生变化?......这样做我可能会破坏(不知道)吗?

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

C)有没有办法在我的应用程序代码中解决这个问题而不修改我的Boost安装?

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

Zac*_*Zac 1

我可以说这是 boost 序列化中的一个错误。我们会在这里看到。

A)
1. 在新存档中添加 BOOST_SERIALIZATION_REGISTER_ARCHIVE 不起作用,因为默认文本存档已被注册 - 似乎仅在注册时才允许。
2. 删除它们可以使其正常工作,因为只有您的自定义类被注册。
3. 通过删除它们,您将无法使用默认文本存档 - 您的课程将被注册。

B
我相当确定“text_?archive.hpp”文件应该像“binary_?archive.hpp”文件一样被分割。有人打补丁吗?

C )
最好的解决方案是提交一个补丁以将文件拆分。对于临时解决方案,最好的方法是将修补后的文件本地放置在项目中,直到修补程序将其放入 boost 中。