【问题标题】:Boost Serialization input stream errorBoost序列化输入流错误
【发布时间】:2014-04-19 04:07:57
【问题描述】:

我正在尝试序列化派生类的成员。该成员继承自基类。序列化代码以非侵入方式包含在基类头文件中。 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

模型库.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;
}

ModelLibraryG4PCS.h

class ModelLibraryG4PCS: public ModelLibrary
{
virtual bool
generateHashTableArchiveName (string &filename);

}

ModelLibrary4GPCS.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;
}

ma​​in.cpp

int main() 
{
    ModelLibraryG4PCS d;
    if (!d.loadHashTable()) {
        /* Some Code to Construct a new Hash Table */
        d.saveHashTable();
    }
}

【问题讨论】:

  • 您会从不再次发布残缺代码以解决问题。我只花了 45 分钟弄清楚你随机变异了 ModelLibrarybaseModelLibraryG4PCSDerived。这并不好笑而且完全没有必要(它浪费了我们所有的时间)。也就是说,下次让它独立:coliru.stacked-crooked.com/a/38cfb33d5bf388a6。它也可以短很多
  • 抱歉,我解决了派生和基础的问题

标签: c++ boost boost-serialization


【解决方案1】:

您的示例代码不是独立的,所以我只能浏览一下。

现在:

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_;

这是一个逆向工程示例,根据您的原始代码进行一些猜测:Live On Coliru

输出

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

【讨论】:

  • 我用独立的代码问了另一个问题,它显示了八叉树节点类的定义。您在此处的序列化代码在这种情况下不起作用。问题在这里:stackoverflow.com/questions/23175180/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2016-05-05
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多