我在不同架构之间加载一些存档数据时遇到了一个奇怪的问题。确切地说:我在我的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;
} */
}