이진 아카이브를 사용하여 부스트 직렬화를 사용하는 데 문제가 있습니다. 파일 스트림을 사용할 때 작동하지만 로컬 변수에 저장하고 궁극적으로 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()와, 그래서 난 내 버퍼에 데이터를 복사하는 내 방식을 추측하거나 에 잘못이다.
이미 C 문자열을 사용하려고했으나 작동하지 않았습니다. 버클리 DB에 원시 데이터를 저장해야하기 때문에 C++ 문자열을 사용하지 않습니다. 직렬화 된 데이터를 버클리 db에 저장 한 다음 나중에 검색하고 직렬화 해제하는 것이 그 목적입니다. – user364688
나는 정확했다. stringstream에는 문자열이 아닌 생성자가 없습니다. 코드가 암시 적 캐스팅을 통해 코드를 만들려고합니다. buf 대신에 std :: string (buf, buf + os.str(). length())을 전달하여 명시 적으로 캐스팅을 시도 할 수 있습니다. std :: string에 대한 char * 생성자가 * first * \ 0에서 멈추고 바이너리 데이터가 아마도 그것들로 가득 차 있기 때문에 문제가 해결됩니다. –
작품, 도움 주셔서 감사합니다! – user364688