C++ 无法使用来自sqlite blob的boost反序列化

C++ 无法使用来自sqlite blob的boost反序列化,c++,sqlite,opencv,boost,C++,Sqlite,Opencv,Boost,我正在尝试从sqlite读取blob数据并对其进行反序列化 我的代码 int init_search(std::string db_path, cv::Mat *voc1, std::list<std::string> *desc_lst) { sqlite3 *sqdb; int rc; unsigned char *bow_data; const char *bow_key ; int bow_size; cv::Mat bow_

我正在尝试从sqlite读取blob数据并对其进行反序列化 我的代码

   int init_search(std::string db_path, cv::Mat *voc1, std::list<std::string> *desc_lst)
    {
    sqlite3 *sqdb;
    int rc;
    unsigned char  *bow_data;
    const char *bow_key ;
int bow_size;

cv::Mat bow_desc,desc_tmp;
//const size_t data_size_bow;
rc = sqlite3_open("C:\\aa\\cvdb\\dna.db", &sqdb);
sqlite3_stmt *stmt = NULL;

do 
{
    rc = sqlite3_prepare_v2(sqdb, "SELECT * FROM dna_tab", -1, &stmt, NULL);
    //sqlite3_bind_text(stmt, 3, bow_key, -1, SQLITE_STATIC);
    rc = sqlite3_step(stmt);
    if (rc == SQLITE_ROW)
    {
        bow_size = sqlite3_column_bytes(stmt, 3);
        bow_data = (unsigned char *)malloc(bow_size);
        //memcpy(bow_data, sqlite3_column_blob(stmt, 3), bow_size);
        //std::stringstream s(bow_key,std::ios_base::in |std::ios_base::binary);
        std::stringstream s((const char *)sqlite3_column_blob(stmt, 3), std::ios_base::binary);


        boost::archive::binary_iarchive  oa(s, std::ios_base::binary);
        oa >> bow_desc;

        cout << bow_desc;
    }
    rc = sqlite3_finalize(stmt);


} while (rc == SQLITE_SCHEMA);
sqlite3_close(sqdb);
return 0;
}
int init_搜索(std::string db_path,cv::Mat*voc1,std::list*desc_lst)
{
sqlite3*sqdb;
int rc;
无符号字符*bow_数据;
常量字符*弓形键;
int bow_大小;
cv::垫弓描述,描述tmp;
//常数大小数据大小弓;
rc=sqlite3_open(“C:\\aa\\cvdb\\dna.db”、&sqdb);
sqlite3_stmt*stmt=NULL;
做
{
rc=sqlite3_prepare_v2(sqdb,“从dna_选项卡中选择*,-1,&stmt,NULL);
//sqlite3绑定文本(stmt,3,弓形键,-1,SQLITE静态);
rc=sqlite3_步(stmt);
if(rc==SQLITE\u行)
{
bow_size=sqlite3_列_字节(stmt,3);
bow_数据=(无符号字符*)malloc(bow_大小);
//memcpy(bow_数据,sqlite3_列_blob(stmt,3),bow_大小);
//std::stringstreams(bow_key,std::ios_base::in | std::ios_base::binary);
std::stringstreams((const char*)sqlite3\u column\u blob(stmt,3),std::ios\u base::binary);
boost::archive::binary\u iarchive oa(s,std::ios\u base::binary);
oa>>船首描述;

cout谢谢大家,谷歌通过定义自定义streambuf的下溢解决了这个问题

      int underflow()
{

    int rec= sqlite3_blob_read(_blob, buf, max_blob_size, 0);
    if (rec != SQLITE_OK) return traits_type::eof();

    setg(buf, buf, buf + max_blob_size);
    return traits_type::to_int_type(*gptr());
}

这是重载streambuf的粗糙方法,但目前我的工作已经完成了…

我不能帮你,但你可以看看如何(反)序列化一个映像(示例在iostream上,但我想你可以很容易地适应)。为什么不干脆放弃所有的boost废话,将行、列、类型、数据写入您的sqlite db?@miki-示例使用的是istream默认接受的文件流,但我在传递StreengStream时出错,我想我无法适应,因为我对CPP和boost@DipakMallick因此,您希望在
stringstr中序列化图像eam
,或者
char*
,或者什么?@miki我想应该是char*,因为我从blob中得到char*
      int underflow()
{

    int rec= sqlite3_blob_read(_blob, buf, max_blob_size, 0);
    if (rec != SQLITE_OK) return traits_type::eof();

    setg(buf, buf, buf + max_blob_size);
    return traits_type::to_int_type(*gptr());
}