序列化C中的对象并在mysql中存储为blob类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了序列化C中的对象并在mysql中存储为blob类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2516字,纯文字阅读大概需要4分钟。
内容图文
我使用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);
}
现在,这在空间方面不一定是最有效的方法,因为在将它们插入数据库之前将整数转换为字符串,这比将它们作为二进制编码的整数插入时需要更多的空间.但是,在这种情况下,写出和读入的代码会更复杂,因为您必须关注如何将整数打包成字节序列以及如何将字节序列解析为一堆整数.上面的代码使用字符串,以便标准库流可以使这部分变得简单,并且可以更直接地演示序列化所需的内容.
内容总结
以上是互联网集市为您收集整理的序列化C中的对象并在mysql中存储为blob类型全部内容,希望文章能够帮你解决序列化C中的对象并在mysql中存储为blob类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。