提升二进制序列化问题

时间:2010-06-11 16:02:35

标签: c++ serialization boost binary

使用二进制存档使用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;
}

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

1 个答案:

答案 0 :(得分:9)

嗯,首先,.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);