Boost序列化输入流错误
Boost Serialization input stream error
我正在尝试序列化派生类的一个成员。此成员是从基类继承的。序列化代码是作为基类头文件的一部分非侵入性地包含的。save()、load()方法是基类实现的一部分。我在尝试运行代码时遇到以下错误:
boost::archive::archive_exception' what(): input stream error
以下是代码的相关部分:
ModelLibrary.h(这是基类)
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/set.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/map.hpp>
#include <boost/serialization/list.hpp>
#include <fstream>
class ModelLibrary()
{
typedef std::pair<const ORROctree::Node::Data*, const ORROctree::Node::Data*> Dipole;
struct Base {
Dipole seg1;
Dipole seg2;
};
typedef std::list<Base> bases_list;
typedef std::map <string, bases_list> SerializeHashTableCell;
typedef NDIMVoxelStructure<SerializeHashTableCell> SerializeHashTable;
public:
bool
saveHashTable();
bool
loadHashTable();
virtual bool
generateHashTableArchiveName (string &filename) = 0;
public:
SerializeHashTable shash_table_; /***** MEMBER TO BE SERIALIZED ******/
};
// SERIALIZATION METHODS FOR THE TYPES USED TO FORM THE SERIALIZEHASHTABLE
namespace boost {
namespace serialization {
template<class Archive>
inline void serialize(Archive & ar, ModelLibrary::SerializeHashTable & h, const unsigned int version)
{
for(int i = 0; i < h.total_num_of_voxels_; ++i)
ar & h.voxels_[i];
ar & h.num_of_voxels_;
ar & h.total_num_of_voxels_i_;
ar & h.bounds_;
ar & h.spacing_;
ar & h.min_center_;
}
template<class Archive>
inline void serialize(Archive & ar, ModelLibrary::Base & b, const unsigned int version)
{
ar & b.seg1;
ar & b.seg2;
}
template<class Archive>
inline void serialize(Archive & ar, ORROctree::Node n, const unsigned int version)
{
ar & n.data_;
ar & n.center_;
ar & n.bounds_;
ar & n.radius_;
ar & n.parent_;
ar & n.children_;
}
template<class Archive>
inline void serialize(Archive & ar, ORROctree::Node::Data d, const unsigned int version)
{
ar & d.id_x_;
ar & d.id_y_;
ar & d.id_z_;
ar & d.neighbors_;
ar & d.lin_id_;
ar & d.num_points_;
ar & d.p_;
}`
} // namespace serialization
} // namespace boost
ModelLibrary.cpp
bool
ModelLibrary::saveHashTable ()
{
string filename;
generateHashTableArchiveName (filename);
cout << "archive filename" << filename;
std::ofstream ofs(filename.c_str());
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa << shash_table_;
// archive and stream closed when destructors are called
return true;
}
bool
ModelLibrary::loadHashTable ()
{
string filename;
generateHashTableArchiveName (filename);
std::ifstream ifs(filename.c_str());
boost::archive::text_iarchive ia(ifs);
ia >> shash_table_;
return true;
}
型号库G4PCS.h
class ModelLibraryG4PCS: public ModelLibrary
{
virtual bool
generateHashTableArchiveName (string &filename);
}
型号库4GPCS.cpp
bool
ModelLibraryG4PCS::generateHashTableArchiveName (string &filename)
{
filename = "";
//Concatenate all Added Models into filename
std::map<std::string, Model*>::const_iterator model_itr = models_.begin();
for (; model_itr != models_.end(); ++model_itr)
{
filename += model_itr->first;
}
// No Models Have been added
if (filename == "")
return false;
std::stringstream ss;
ss << pair_width_ << "_" << dipole_width_ << "_" << voxel_size_ << ".hash";
filename += ss.str();
return true;
}
main.cpp
int main()
{
ModelLibraryG4PCS d;
if (!d.loadHashTable()) {
/* Some Code to Construct a new Hash Table */
d.saveHashTable();
}
}
您的示例代码不是自包含的,所以我只能浏览一下。
目前:
for(int i = 0; i < h.total_num_of_voxels_; ++i)
ar & h.voxels_[i];
ar & h.num_of_voxels_;
ar & h.total_num_of_voxels_i_;
你认为这怎么可能奏效?显然,在反序列化时,h.total_num_of_voxels
在循环时为零或不确定。假设它是一个数组(或者至少是存储器中连续存储的元素),请使用数组适配器:
ar & boost::serialization::make_array(h.voxels_, h.total_num_of_voxels_);
ar & h.num_of_voxels_;
下面是一个逆向工程示例,根据您的原始代码进行一些猜测:LiveOnColiru
输出
g++ -std=c++11 -Os -pedantic main.cpp -lboost_system -lboost_serialization && ./a.out && tail *.hash
archive filenameonetwo42_4242_999.hash
22 serialization::archive 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
相关文章:
- 如何忽略输入流中的某些字符?
- 为什么不能通过在错误输入后设置 std::cin.clear() 来使用 std::cin?
- C++输入流.与 cin unget() 函数有点混淆
- 从输入流中读取行,并能够跳过块
- 使用 Visual Studio 代码读取 C++ 中的输入流时出错
- 处理输入流运算符>>中的无效输入
- 这段代码在获得错误输入时不会阻止 stoi 运行
- 树莓派上的端口音频,找不到输入流的设备
- 无法转换 .CATPart 文件.错误:输入文件路径似乎包含不支持的字符
- 如何将C++输入流分隔符包含在结果令牌中
- 如果两个输入流相等,我如何构造主()到输出是
- 使用非成员函数从输入流中提取类对象
- CIN是否将输入流中的无效字符取用
- 提升输入流错误.如何将标准:矢量的动态矢量另存为 XML 文件
- C++Boost序列化:输入流错误
- 提升反序列化问题:运行时输入流错误 (c++)
- getline 和在类函数中传递输入流,主表达式错误
- 提升序列化:向前兼容失败,出现输入流错误
- c++ Boost反序列化what():输入流错误
- Boost序列化输入流错误