2010-11-25 9 views
14
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; 

¿Cómo puedo serializar las "tareas" del miembro utilizando bibliotecas de impulso?¿Cómo puedo serializar un std :: vector con boost :: serialization?

+0

¿este código no funciona? Lo que ingresaste parece correcto. ¿Qué error estás recibiendo? – robert

Respuesta

2

lo siento, que resuelven usando

ar & BOOST_SERIALIZATION_NVP(tasks); 

TNX bye

24
#include <boost/serialization/vector.hpp> 

Lea también tutorial.

+3

El texto "vector" no aparece en la documentación vinculada. –

9

Solo para agregar un ejemplo genérico a esta pregunta. Supongamos que queremos serializar un vector sin clases ni nada. Se trata de cómo puede hacerlo:

#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; 
} 

Desde que uso de Qt, este es el contenido de mi qmake pro de archivos, mostrando cómo vincular e incluir archivos 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

En caso de que alguien va a necesitar escribir explícito 'serializar' método sin ninguna incluye cabeceras de refuerzo (para fines abstractos, etc.):

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]; 
     } 
    } 
} 
Cuestiones relacionadas