你完全以错误的方式解决这个问题.这不是“序列化”,事实上它很可能与序列化相反 – 它只是试图将向量的原始内存转储写入数据库.想象一下这个向量看起来像这样的东西:
struct vector_int {
unsigned int num_elements;
int* elements;
};
其中elements是一个动态分配的数组,用于保存向量的元素.
最后写到数据库的是num_elements的值,然后是指针元素的值.元素数据不会写入数据库,如果您要将指针位置加载回程序的不同运行中的向量,则它指向的位置将包含垃圾. std :: vector会发生同样的事情,因为它包含动态分配的内存,将在您的情况下写为指针值,以及其他内部状态,如果重新加载可能无效.
“序列化”的全部意义在于避免这种情况.序列化意味着将这样的复杂对象转换为包含重构原始对象所需的所有信息的字节序列.您需要迭代向量并写出其中的每个整数.而且,你需要设计一种格式,当你重读它时,你可以确定一个整数的结束和下一个整数的开始.
例如,您可以用空格分隔整数,并将它们写成如下:
1413 1812 1 219 4884 -57 12
然后当你读回这个blob时,你必须将这个字符串解析成七个单独的整数并将它们插入到一个新创建的向量中.
要写出的示例代码:
vector vectorTest(10,100);
ostringstream os;
for (vector::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 vectorTest;
istringstream is(blob);
int n;
while(is >> n) {
vectorTest.push_back(n);
}
现在,这在空间方面不一定是最有效的方法,因为在将它们插入数据库之前将整数转换为字符串,这比将它们作为二进制编码的整数插入时需要更多的空间.但是,在这种情况下,写出和读入的代码会更复杂,因为您必须关注如何将整数打包成字节序列以及如何将字节序列解析为一堆整数.上面的代码使用字符串,以便标准库流可以使这部分变得简单,并且可以更直接地演示序列化所需的内容.