ald*_*ldo 10 c++ serialization boost boost-serialization visual-c++
注意:
Boost的归档方案基于对称的输入和输出归档类.一直写下这两个都很乏味,所以我会用它?archive
来表示oarchive
和iarchive
.
总结:
从改变我的自定义档案的基类后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"标题,那么一切正常.(但我真的不希望修改我的升压安装!)
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
我可以说这是 boost 序列化中的一个错误。我们会在这里看到。
A)
1. 在新存档中添加 BOOST_SERIALIZATION_REGISTER_ARCHIVE 不起作用,因为默认文本存档已被注册 - 似乎仅在注册时才允许。
2. 删除它们可以使其正常工作,因为只有您的自定义类被注册。
3. 通过删除它们,您将无法使用默认文本存档 - 您的课程将被注册。
B)
我相当确定“text_?archive.hpp”文件应该像“binary_?archive.hpp”文件一样被分割。有人打补丁吗?
C )
最好的解决方案是提交一个补丁以将文件拆分。对于临时解决方案,最好的方法是将修补后的文件本地放置在项目中,直到修补程序将其放入 boost 中。
归档时间: |
|
查看次数: |
938 次 |
最近记录: |