gpt4 book ai didi

c++ - Boost二进制序列化问题

转载 作者:太空狗 更新时间:2023-10-29 20:01:08 25 4
gpt4 key购买 nike

我在使用二进制存档进行 boost 序列化时遇到问题。它在使用文件流时有效,但我想将它存储在我的本地变量中并最终将它保存到/从 berkeley db 加载。执行程序时,我得到一个 boost::archive::archive_exception:在实例化 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;
}

它在使用 os.str() 初始化 is 时有效,所以我想我将数据复制到缓冲区或 的方式是 是错误的。

最佳答案

嗯,一方面,.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);

关于c++ - Boost二进制序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3024314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com