【发布时间】:2020-03-17 16:07:35
【问题描述】:
我们在 linux (gcc) 和 Windows 上的项目中都使用了 boost 序列化。 我们仅在 Windows 上遇到问题(对于“每个”版本的 Windows(7 和 10)和 MSVC:Visual 2010 和 2015,即 MSVC++ 10.0 _MSC_VER == 1600 或 MSVC++ 14.0 _MSC_VER == 1900)。
这里是总结的问题,但我需要在后面提供更多细节: 当我序列化一个类时
- 有基类
- 并且有2个ClassB的shared_ptr向量,内容相同,B继承自同一个基类
是的,很奇怪:
- 如果我删除基类,它就可以工作。
- 如果我内联基类的序列化代码(空函数),它可以工作。
- 如果 2 个向量的内容不同,则有效!!
-
如果我在 ClassTest 的 serialize 方法中注册 ClassBase,它可以工作。即:
// in ClassTest: template <class Archive> void serialize(Archive & ar, const unsigned int version) { ar.template register_type<ClassBase>(); ... }
一些细节
当它在 linux 上运行时,当它在 Windows 上运行时,存档中的 ClassBase 类型注册,我们有相同的 xml 输出。
值得注意的是:
- boost_serialization 在 Windows 上是 17 版,在 linux 上是 9 版(我还没有尝试在 linux 上更新 boost)。
- 在 BaseClass xml 标记上,tracking_level="1",所以我们有 object_id。
而当它不起作用时(再次说明:ClassTest的序列化是可以的,但不能反序列化“输入流错误”):
- 主要区别在于ClassTest的序列化:ClassBase部分没有tracking_level。
- 但这不是唯一的原因,因为如果向量不同(相同的 2 个第一项和一个向量中的第三项),ClassTest 部分中 ClassBase 的 tracking_level 为“0”。
最后一件事,如果它能给你一些线索:当我们调试我们的应用程序时,我们注意到反序列化框架试图将一个类反序列化为另一个类。
这让我觉得序列化框架对类类型标识感到困惑。
会不会是dll链接的问题?全局静态共享存储?
我已经发布了一个视觉工作室解决方案here。
非常感谢您的帮助。如果需要任何澄清,我当然可以!
【问题讨论】:
标签: c++ serialization boost shared-ptr