Вы идете об этом совершенно неправильно. Это не «сериализация», на самом деле это вполне возможно противоположность сериализации - это просто попытка записать дамп памяти вектора в базу данных. Представьте на секунду, что вектор выглядит примерно так:
struct vector_int {
unsigned int num_elements;
int* elements;
};
Где elements
- это динамически размещенный массив, содержащий элементы вектора.
То, что вы в итоге записали бы в свою базу данных, это значение num_elements
, а затем значение указатель 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);
}
Теперь, это не обязательно самый эффективный подход с точки зрения пространства, так как он превращает ваши целые числа в строки перед вставкой их в базу данных, что займет гораздо больше места, чем если бы вы только что вставили их в двоичном коде целые числа. Тем не менее, код для записи и чтения будет более сложным в этом случае, потому что вам придется задуматься о том, как вы упаковываете целые числа в последовательность байтов и как вы разбираете последовательность байтов в кучу целых чисел. В приведенном выше коде используются строки, так что стандартные потоки библиотеки могут упростить эту часть и более наглядно продемонстрировать, что влечет за собой сериализация.