Как я могу сериализовать std :: vector с boost :: serialization? - PullRequest
17 голосов
/ 25 ноября 2010
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;

Как я могу сериализовать "задачи" члена, используя библиотеки повышения?

Ответы [ 4 ]

28 голосов
/ 25 ноября 2010
#include <boost/serialization/vector.hpp>

Также прочитайте учебник .

11 голосов
/ 24 января 2015

Просто чтобы добавить общий пример к этому вопросу. Предположим, мы хотим сериализовать вектор без каких-либо классов или чего-либо еще. Вот как вы можете это сделать:

#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, показывающее, как связывать и включать файлы повышения:

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
4 голосов
/ 30 мая 2016

В случае, если кому-то когда-либо понадобится написать явный метод 'serialize' без любого включения заголовков наддува (для абстрактных целей и т. Д.):

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];
        }
    }
}
1 голос
/ 25 ноября 2010

извините, Я решил использовать

ar & BOOST_SERIALIZATION_NVP(tasks);

Тая прощай

...