C++ MSVC与vector的Boost序列化(bug?)问题<;共享\u ptr>;在几个图书馆
我们在linux(gcc)和Windows上的项目中使用boost序列化。 我们只在Windows上遇到问题(对于Windows(7和10)的“每个”版本以及MSVC:Visual 2010和2015,即MSVC++10.0\u MSC\u VER==1600或MSVC++14.0\u MSC\u VER==1900) 以下是问题摘要,但我需要在以下内容之后提供更多详细信息: 当我序列化一个类时C++ MSVC与vector的Boost序列化(bug?)问题<;共享\u ptr>;在几个图书馆,c++,serialization,boost,shared-ptr,C++,Serialization,Boost,Shared Ptr,我们在linux(gcc)和Windows上的项目中使用boost序列化。 我们只在Windows上遇到问题(对于Windows(7和10)的“每个”版本以及MSVC:Visual 2010和2015,即MSVC++10.0\u MSC\u VER==1600或MSVC++14.0\u MSC\u VER==1900) 以下是问题摘要,但我需要在以下内容之后提供更多详细信息: 当我序列化一个类时 哪些有基类 并且有2个类B的共享_ptr向量,具有相同的内容,并且B继承自相同的基类 序列化可以
- 哪些有基类
- 并且有2个类B的共享_ptr向量,具有相同的内容,并且B继承自相同的基类
- 如果我删除基类,它就会工作
- 如果我内联基类的序列化代码(空函数),它就可以工作
- 如果两个向量没有相同的内容,它就可以工作李>
- 如果我在ClassTest的serialize方法中注册ClassBase,它就可以工作了。即:
// in ClassTest: template <class Archive> void serialize(Archive & ar, const unsigned int version) { ar.template register_type<ClassBase>(); ... }
//在ClassTest中: 模板 无效序列化(存档和ar,常量未签名整数版本){ ar.template寄存器类型(); ... }
值得注意的是:
- boost_序列化在Windows上是17版,在linux上是9版(我还没有尝试在linux上更新boost)
- 在基类xml标记上,跟踪级别为“1”,因此我们有对象id
- 主要区别在于ClassTest的序列化:ClassBase部分没有跟踪级别
- 然而,这并不是唯一的原因,因为如果向量是不同的(相同的两个第一项,一个向量中的第三项),那么ClassTest部分中ClassBase的跟踪级别为“0”
这让我觉得序列化框架对类类型标识感到困惑。
这可能是dll链接的问题吗?全局静态共享存储 我发布了一个VisualStudio解决方案
非常感谢你的帮助。如果需要任何澄清,我当然可以 如果有些人有同样的问题,并且正在浏览这个论坛,我会在这里发布一个答案。 多亏了boost Developers(您可能会读到),修复方法是将ClassBase标记为track\u:
BOOST_CLASS_TRACKING(ClassBase,BOOST::serialization::track_always)如果一些人有同样的问题,并且正在浏览这个论坛,我会在这里发布一个答案。 多亏了boost Developers(您可能会读到),修复方法是将ClassBase标记为track\u: BOOST\u类跟踪(类库,BOOST::序列化::始终跟踪)