C++ MSVC与vector的Boost序列化(bug?)问题<;共享\u ptr>;在几个图书馆

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继承自相同的基类 序列化可以

我们在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继承自相同的基类
序列化可以工作,但反序列化不能(“输入流错误”)。

是的,很奇怪:

  • 如果我删除基类,它就会工作
  • 如果我内联基类的序列化代码(空函数),它就可以工作
  • 如果两个向量没有相同的内容,它就可以工作
  • 如果我在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寄存器类型();
    ...
    }
    
一些细节

当它在linux上工作时,当它在Windows上工作时,并且在存档中注册了ClassBase类型时,我们有相同的xml输出。
值得注意的是:

  • boost_序列化在Windows上是17版,在linux上是9版(我还没有尝试在linux上更新boost)
  • 在基类xml标记上,跟踪级别为“1”,因此我们有对象id
当它不起作用时(再次说明:ClassTest的序列化是正常的,但无法反序列化“输入流错误”):

  • 主要区别在于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::序列化::始终跟踪)