【问题标题】:How can I serialize an std::vector with boost::serialization?如何使用 boost::serialization 序列化 std::vector?
【发布时间】:2011-05-15 15:24:03
【问题描述】:
class workflow {

private:
friend class boost::serialization::access;

template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
  ar & tasks;
  ar & ID;
}

 vector<taskDescriptor> tasks;
 int ID;

如何使用 boost 库序列化成员“任务”?

【问题讨论】:

  • 这段代码不起作用吗?您输入的内容看起来正确。你遇到了什么错误?

标签: c++ boost vector serialization


【解决方案1】:
#include <boost/serialization/vector.hpp>

另请阅读tutorial

【讨论】:

  • 链接文档中没有出现文本“vector”。
【解决方案2】:

只是为这个问题添加一个通用示例。假设我们想要序列化一个没有任何类或任何东西的向量。你可以这样做:

#include <iostream>
#include <fstream>

// include input and output archivers
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

// include this header to serialize vectors
#include <boost/serialization/vector.hpp>

using namespace std;



int main()
{

  std::vector<double> v = {1,2,3.4, 5.6};

  // serialize vector
  {
    std::ofstream ofs("/tmp/copy.ser");
    boost::archive::text_oarchive oa(ofs);
    oa & v;
  }

   std::vector<double> v2;

   // load serialized vector into vector 2
   {
     std::ifstream ifs("/tmp/copy.ser");
     boost::archive::text_iarchive ia(ifs);
     ia & v2;
   }

   // printout v2 values
   for (auto &d: v2 ) {
      std::cout << d << endl;
   }


  return 0;
}

由于我使用 Qt,这是我的 qmake pro 文件内容,展示了如何链接和包含 boost 文件:

TEMPLATE = app
CONFIG -= console
CONFIG += c++14
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp


include(deployment.pri)
qtcAddDeployment()

INCLUDEPATH += /home/m/Downloads/boost_1_57_0


unix:!macx: LIBS += -L/home/m/Downloads/boost_1_57_0/stage/lib -lboost_system
unix:!macx: LIBS += -L/home/m/Downloads/boost_1_57_0/stage/lib -lboost_serialization

【讨论】:

    【解决方案3】:

    如果有人需要编写显式的“序列化”方法没有任何包含 boost 标头(用于抽象目的等):

    std::vector<Data> dataVec;
    int size; //you have explicitly add vector size
    
    template <class Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        if(Archive::is_loading::value) {
            ar & size;
            for(int i = 0; i < size; i++) {
                Data dat;
                ar & dat;
                dataVec.push_back(dat);
            }
        } else {
            size = dataVec.size();
            ar & size;
            for(int i = 0; i < size; i++) {
                ar & dataVec[i];
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      对不起, 我用

      解决了
      ar & BOOST_SERIALIZATION_NVP(tasks);
      

      tnx 再见

      【讨论】:

      • 你能告诉我它是如何工作的吗?我也一直想知道
      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2018-02-02
      • 2011-09-21
      • 2012-02-24
      • 2016-01-24
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多