序列化C中的对象并在mysql中存储为blob类型
我使用
mysql / C连接器连接到
mysql数据库.我有一些复杂的数据结构,所以我需要序列化这些并保存在数据库中.
我试过以下的东西. vector<int> vectorTest(10,100); istream *blob = NULL; ostringstream os; int size_data = sizeof(vector<int>); blob = new istringstream((char*)&vectorTest,istringstream::in | istringstream::binary); string qry = "INSERT INTO vector(id,object) VALUES (?,?)"; prep_stmt = con->prepareStatement(qry); prep_stmt->setInt(1,1); prep_stmt->setBlob(2,blob); prep_stmt->execute(); 我刚刚尝试了一个小例子.但是,矢量对象未被保存. 或者,我可以使用以下方法. ostringstream os; int size_data = sizeof(vector<int>); os.write((char*)&vectorTest,size_data); 但是我不知道如何将输出流重定向到输入流,因为setBlob()方法需要一个istream作为输入参数. 我可以知道如何使这些例子有效吗?如果我的方法不正确,任何人都可以提供代码示例或改进给定的代码段吗?非常感谢您的即时回复. 谢谢 解决方法
你完全以错误的方式解决这个问题.这不是“序列化”,事实上它很可能与序列化相反 – 它只是试图将向量的原始内存转储写入数据库.想象一下这个向量看起来像这样的东西:
struct vector_int { unsigned int num_elements; int* elements; }; 其中elements是一个动态分配的数组,用于保存向量的元素. 最后写到数据库的是num_elements的值,然后是指针元素的值.元素数据不会写入数据库,如果您要将指针位置加载回程序的不同运行中的向量,则它指向的位置将包含垃圾. std :: vector会发生同样的事情,因为它包含动态分配的内存,将在您的情况下写为指针值,以及其他内部状态,如果重新加载可能无效. “序列化”的全部意义在于避免这种情况.序列化意味着将这样的复杂对象转换为包含重构原始对象所需的所有信息的字节序列.您需要迭代向量并写出其中的每个整数.而且,你需要设计一种格式,当你重读它时,你可以确定一个整数的结束和下一个整数的开始. 例如,您可以用空格分隔整数,并将它们写成如下: 1413 1812 1 219 4884 -57 12 然后当你读回这个blob时,你必须将这个字符串解析成七个单独的整数并将它们插入到一个新创建的向量中. 要写出的示例代码: vector<int> vectorTest(10,100); ostringstream os; for (vector<int>::const_iterator i = vectorTest.begin(); i != vectorTest.end(); ++i) { os << *i << " "; } // Then insert os.str() into the DB as your blob 要读入的示例代码: // Say you have a blob string called "blob" vector<int> vectorTest; istringstream is(blob); int n; while(is >> n) { vectorTest.push_back(n); } 现在,这在空间方面不一定是最有效的方法,因为在将它们插入数据库之前将整数转换为字符串,这比将它们作为二进制编码的整数插入时需要更多的空间.但是,在这种情况下,写出和读入的代码会更复杂,因为您必须关注如何将整数打包成字节序列以及如何将字节序列解析为一堆整数.上面的代码使用字符串,以便标准库流可以使这部分变得简单,并且可以更直接地演示序列化所需的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |