我正在尝试使用 boost 保存由 ORB-SLAM 构建的地图,该代码在 linux 中运行良好,但是当我将其移动到 Windows 时,我在加载数据时遇到了异常。下面是我的部分代码,这是一个大项目,所以我只展示相关代码。
.h 中的一些代码
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
boost::serialization::split_member(ar, *this, version);
}
template<class Archive>
void save(Archive & ar, const unsigned int version) const;
template<class Archive>
void load(Archive & ar, const unsigned int version);
CPP简介
template<class Archive>
void Map::load(Archive & ar, const unsigned int version)
{
unsigned int test_data;
int nItems;
ar & nItems;
cout << "{INFO}mspMapPoints size = " << nItems << endl;
for (int i = 0; i < nItems; ++i) {
MapPoint* pMapPoint = new MapPoint();
ar & *pMapPoint;
mspMapPoints.insert(pMapPoint);
}
ar & nItems;
cout << "{INFO}mspKeyFrames size = " << nItems << endl;
for (int i = 0; i < nItems; ++i) {
KeyFrame* pKeyFrame = new KeyFrame;
ar & *pKeyFrame;
mspKeyFrames.insert(pKeyFrame);
}
ar & nItems;
cout << "{INFO}mvpKeyFrameOrigins size = " << nItems << endl;
for (int i = 0; i < nItems; ++i) {
KeyFrame* pKeyFrame = new KeyFrame;
ar & *pKeyFrame;
/* TODO : VerifyHere*/
mvpKeyFrameOrigins.push_back(*mspKeyFrames.begin());
}
ar & const_cast<long unsigned int &> (mnMaxKFid);
ar & test_data;
if (test_data == TEST_DATA)
cout <<">>Map Loading Validated as True" << endl;
else
cout <<"ERROR Map Loading Validated as False: Got -" << test_data << " :( Check Load Save sequence" << endl;
}
调用函数如下:
void System::LoadMap(const string &filename)
{
{
std::ifstream is(filename,std::ios::binary);
boost::archive::binary_iarchive ia(is, boost::archive::no_header);
//ia >> mpKeyFrameDatabase;
ia >> mpMap;
}
cout << endl << filename <<" : Map Loaded!" << endl;
}
void System::SaveMap(const string &filename)
{
std::ofstream os(filename,std::ios::binary);
{
boost::archive::binary_oarchive oa(os, boost::archive::no_header);
//oa << mpKeyFrameDatabase;
oa << mpMap;
}
cout << endl << "Map saved to " << filename << endl;
}
在 Linux 中保存和加载都可以,但是加载只会抛出 boost::archive::archive_exception 问题,没有告诉我任何细节。