Stimuler La Sérialisation Binaire Problème
J'ai un problème d'utilisation de boost de sérialisation à l'aide de binaire archives. Il fonctionne lorsque vous utilisez un fichier de flux, mais je veux le ranger dans ma variable locale et, finalement, sauver/charger/à partir de berkeley db.
Lors de l'exécution du programme, j'obtiens un boost::archive::archive_exception: "stream erreur" lors de l'instanciation 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;
}
Il fonctionne au moment de l'initialisation est avec os.str(), donc je suppose que ma façon de copier les données dans ma mémoire tampon ou est est faux.
OriginalL'auteur user364688 | 2010-06-11
Vous devez vous connecter pour publier un commentaire.
Bien, pour une chose .de données() ne dispose pas d'un terminal \0. Ce n'est pas un c-string. Je ne savais même pas stringstream avait un char* constructeur (qui dans leur bon esprit l'utilise plus?) mais apparemment, et je serais prêt à parier qu'il s'attend à \0.
Pourquoi essayez-vous de le faire de cette façon, de toute façon? Vous êtes beaucoup mieux de travail dans les chaînes C++. Initialiser avec os.str().
Edit: données binaires contient beaucoup de \0 caractères et les std::string(char*) constructeur s'arrête à la première. Votre désérialisation routine alors, inévitablement, essayez de lire au-delà de la fin du flux (car il n'est pas complet). Utiliser l'itérateur constructeur de std::string quand vous passez buf dans les stringstream.
J'ai été correct. Il n'existe pas de chaîne non constructeur de stringstream. Votre code tente d'en créer un via la conversion implicite. Vous pouvez essayer explicitement casting en passant std::string(buf, buf+os.str().longueur()) au lieu de buf si vraiment vous insistez. Cela devrait résoudre votre problème depuis le char* constructeur de std::string va s'arrêter à la premier \0 il trouve et vos données binaires est probablement deviné avec eux.
fonctionne, merci pour l'aide!
OriginalL'auteur Crazy Eddie