use*_*688 3 c++ binary serialization boost
我使用二进制存档使用boost序列化时遇到问题.它在使用文件流时有效但我想将它存储在我的本地变量中并最终将其保存/加载到berkeley db中.执行程序时,我在实例化binary_iarchive时得到一个boost :: archive :: archive_exception:'stream error' .
#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;
}
Run Code Online (Sandbox Code Playgroud)
当初始化时,它的工作原理是用os.str() ,所以我想将数据复制到我的缓冲区我的方式,或者是错了.
好吧,一方面.data()没有终端\ 0.它不是一个c弦.我甚至没有意识到stringstream有一个char*构造函数(他们在正确的思想中使用它们了吗?)但显然它确实如此,我敢打赌它期望\ 0.
你为什么要这样做呢?你在C++字符串中工作要好得多.初始化是使用os.str().
编辑:二进制数据包含大量\ 0字符,std :: string(char*)构造函数在第一个停止.然后,您的反序列化例程将不可避免地尝试读取流的末尾(因为它不完整).将buf传递给stringstream时,请使用std :: string的迭代器构造函数.
std::stringstream is(std::string(buf, buf+os.str().length()), flags);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10920 次 |
| 最近记录: |