Tengo un problema el uso de impulsar el uso de la serialización binaria de archivos. Funciona cuando se utiliza una secuencia de archivo, pero quiero guardar en mi variable local y, por último, guardar/cargar a/desde berkeley db.
Al ejecutar el programa me sale un boost::archivo::archive_exception: ‘stream’ error al crear instancias de la binary_iarchive.

#include <sys/time.h>
#include <string>
#include <boost/serialization/serialization.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
#include <sstream>
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, timeval & t, const unsigned int version)
{
ar & t.tv_sec;
ar & t.tv_usec;
}
}//namespace serialization
}//namespace boost
int main(int, char**)
{
timeval t1;
gettimeofday(&t1, NULL);
char buf[256];
std::stringstream os(std::ios_base::binary| std::ios_base::out| std::ios_base::in);
{
boost::archive::binary_oarchive oa(os, boost::archive::no_header);
oa << t1;
}
memcpy(buf, os.str().data(), os.str().length());
if(memcmp(buf, os.str().data(), os.str().length()) != 0)
printf("memcpy error\n");
timeval t2;
{
std::stringstream is(buf, std::ios_base::binary| std::ios_base::out| std::ios_base::in);
boost::archive::binary_iarchive ia(is, boost::archive::no_header);
ia >> t2;
}
printf("Old(%d.%d) vs New(%d.%d)\n", t1.tv_sec, t1.tv_usec, t2.tv_sec, t2.tv_usec);
return 0;
}

Funciona cuando se inicializa es con os.str(), así que supongo que mi forma de copiar los datos a mi buffer o a es está mal.

InformationsquelleAutor user364688 | 2010-06-11

1 Comentario

  1. 9

    Bueno, por una cosa .de datos() no tiene un terminal \0. No es un c-string. Ni siquiera me di cuenta stringstream había un char* constructor (quien en su sano juicio se utiliza más?) pero al parecer lo hace y yo apostaría que espera \0.

    Por qué estás tratando de hacerlo de esa manera de todos modos? Es mucho mejor empezar a trabajar en las cadenas C++. Inicializar con os.str().

    Edición: binario de datos contiene gran cantidad de \0 caracteres y el std::string(char*) constructor se detiene en la primera. Su deserialización rutina, a continuación, inevitablemente, intenta leer más allá del final de la secuencia (porque no es completo). Utilice el constructor del iterador para std::string cuando se pasa buf en el stringstream.

    std::stringstream is(std::string(buf, buf+os.str().length()), flags);
    • Ya he probado a utilizar un c-string, pero que no funciona tampoco. Yo no uso c++ cadenas, porque necesito obtener los datos en bruto para guardar en mi base de datos berkeley db. El objetivo de esto es para guardar los datos serializados en la base de datos berkeley db y luego recuperar y unserialize ella.
    • Yo estaba en lo correcto. No hay no-constructor de cadena para stringstream. El código intenta crear una a través de la conversión implícita. Usted podría tratar explícitamente de fundición pasando std::string(buf, buf+os.str().length()) en lugar de buf si realmente insistir. Esto debería solucionar el problema ya que el char* constructor de std::string va a parar a la antes \0 se encuentra y los datos binarios es, probablemente, plagado de ellos.
    • funciona, muchas gracias por la ayuda!

Dejar respuesta

Please enter your comment!
Please enter your name here