“相同”代码的不同boost序列化头版本

时间:2016-05-11 11:40:12

标签: c++ matlab serialization boost mex

我在不同架构之间加载一些存档数据时遇到了一个奇怪的问题。确切地说:我在我的c ++代码中序列化一个结构(以10的存档版本保存)。 然后应该在我的matlab mex项目中对此存档进行反序列化,但由于版本冲突而失败

  

MEX文件中出现意外的标准异常。 What()是:不支持   版本

之后,我在MEX项目中序列化了相同的结构。这导致归档版本为9。 为了验证,如果在编译期间使用了不同的boost版本,我在两个项目中打印出以下MACRO

cout << "BOOST VERSION " << BOOST_VERSION << endl;

在两个代码中,都返回了cpp项目和MEX项目,版本 105500 。我还使用 ldd 命令验证,如果二进制文件链接到正确的库并且它们是

  

ldd testFooMex.mexa64           libboost_serialization.so.1.55.0 =&gt; /home/PATH/TO/Libraries/boost/lib/libboost_serialization.so.1.55.0(0x00007f52d5149000)

     

ldd test.exe           libboost_serialization.so.1.55.0 =&gt; /home/PATH/TO/Libraries/boost/lib/libboost_serialization.so.1.55.0(0x00007f52d5149000)

如果我在文本存档中手动将版本号从10更改为9,我的结构可以在MEX项目中反序列化而不会出现任何问题。

你们有任何想法,为什么使用不同的版本,即使我使用相同的提升版本?

以下是一些代码段。在两个项目中(基于this post),我使用相同的 Header.h

#ifndef Test_h
#define Test_h
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
typedef boost::archive::text_oarchive OutputArchive;
typedef boost::archive::text_iarchive InputArchive;

struct Test
{
private:
  friend std::ostream& operator<<(std::ostream& os, const Test& t );
  friend class boost::serialization::access;

  template<typename Archive>
  void serialize( Archive& ar, const unsigned int version )
  {
    ar & i;
    ar & d;
    ar & *p;

  }

public:
  int i;
  double d;
  double* p;

  Test()
  {
    p=new double;
  }

  Test( int _i, double _d )
  {
    i=_i;
    d=_d;
    p = new double;
    *p=d*2;
  }
  ~Test(){ delete p; }
};

std::ostream& operator<<( std::ostream& os, const Test& t )
{
  os << t.i << ", " << t.d << ",  " << *(t.p) << std::endl;
}

#endif Test_h

TEST.CPP

#include <iostream>
#include <fstream>
#include "Test.h"
#include "boost/version.hpp"
using namespace std;

int main()
{
    cout << "BOOST VERSION " << BOOST_VERSION << endl;
  Test t(1,0.1);
  {
    std::ofstream ofs("serialize.txt");
    OutputArchive oa(ofs);
    oa << t;
  }
  cout << "original : " << t;

  {
    ifstream ifs("serialize.txt",ios_base::in);
    InputArchive ia(ifs);
    Test t2;
    cout << "ready to import..." << flush;
    ia >> t2;
    cout << "done" << endl;
    cout << "restored : " << t2;
  }
}

testFooMex.cpp

#include "mex.h"
#include "Test.h"

#include <iostream>
#include <fstream>
#include "boost/version.hpp"

using namespace std;

void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[] )
{
  // FAILS TO LOAD FILE WITH VERSION 10
  cout << "BOOST VERSION " << BOOST_VERSION << endl;
  Test t;
  ifstream in( "serialize.txt", ios_base::in );
  InputArchive ia(in);
  ia >> t;
  mexPrintf("%i\n",t.i);
  mexPrintf("%f\n",t.d);
  mexPrintf("%f\n",*(t.p));


 /* GENERATES THE SAME FILE WITH VERSION 9
 Test t(1,0.1);
  {
    std::ofstream ofs("serialize.out");
    OutputArchive oa(ofs);
    oa << t;
  }
  cout << "original : " << t;

  {
    ifstream ifs("serialize.out",ios_base::in);
    InputArchive ia(ifs);
    Test t2;
    cout << "ready to import..." << flush;
    ia >> t2;
    cout << "done" << endl;
    cout << "restored : " << t2;
  } */
}

0 个答案:

没有答案