使用boost序列化保存的加载文件出错

问题描述

我正在研究如何在android上运行ORB_SLAM2。

目前,我可以通过ORB_SLAM2扫描地图并将其保存在Android版本上。

我也确定可以将地图重新​​加载到Android版本的ORB_SLAM2。

但是我使用PC版本重新加载由Android设备保存的地图,它会崩溃,反之亦然。

错误日志与boost / save_object_data有关。

RaiseException
CxxThrowException
cv::error
cv::error
cv::Mat::setDefaultAllocator
cv::Mat::create
RegisterDebugCallback
boost::archive::detail::oserializer<boost::archive::binary_oarchive,std::map<ORB_SLAM2::KeyFrame * __ptr64,unsigned __int64,std::less<ORB_SLAM2::KeyFrame * __ptr64>,std::allocator<std::pair<ORB_SLAM2::KeyFrame * __ptr64 const,unsigned __int64> > > >::save_object_data
boost::archive::detail::oserializer<boost::archive::binary_oarchive,std::set<ORB_SLAM2::MapPoint * __ptr64,std::less<ORB_SLAM2::MapPoint * __ptr64>,std::allocator<ORB_SLAM2::MapPoint * __ptr64> > >::save_object_data
boost::archive::detail::oserializer<boost::archive::binary_oarchive,std::vector<std::list<ORB_SLAM2::KeyFrame * __ptr64,std::allocator<ORB_SLAM2::KeyFrame * __ptr64> >,std::allocator<std::list<ORB_SLAM2::KeyFrame * __ptr64,std::allocator<ORB_SLAM2::KeyFrame * __ptr64> > > > >::save_object_data
boost::archive::detail::oserializer<boost::archive::binary_oarchive,unsigned __int64> > > >::save_object_data
boost::serialization::singleton_module::get_lock
InitSlamObject

有人知道如何解决这个问题。 谢谢!!!

解决方法

默认二进制归档文件不可移植。在不同的体系结构或编译器配置上读取它们会导致未定义的行为

例如参见boost binary_oarchive works differently for different compilers用于便携式替代品

除此之外,版本控制可能是一个问题。可以实现版本控制(类版本控制和Boost库版本控制),但是如果支持不正确,则可能会失败。

此外,检查序列化代码是否正确。值得注意的是,错误似乎源自setDefaultAllocator,它是静态的:

static void cv::Mat::setDefaultAllocator    (   MatAllocator *  allocator   )

每次都调用它似乎很奇怪,尤其是在 save 操作中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...