我试图二进制序列化矢量数据。 在此示例下面我序列化到一个字符串,然后反序列化回为矢量,但不要让我开始用相同的数据。 为什么会出现这样的情况?
vector<size_t> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
string s((char*)(&v[0]), 3 * sizeof(size_t));
vector<size_t> w(3);
strncpy((char*)(&w[0]), s.c_str(), 3 * sizeof(size_t));
for (size_t i = 0; i < w.size(); ++i) {
cout << w[i] << endl;
}
我期望得到的输出
1
2
3
而是得到输出
1
0
0
(上GCC-4.5.1 )
该错误是在调用strncpy
。 从链接页面:
如果SRC的长度小于n,函数strncpy()焊盘dest的与空字节的余数。
所以,第一后0
在序列化的数据字节被发现的剩余w
的数据阵列与填充0
秒。
为了解决这个问题,使用for
循环,或std::copy
std::copy( &s[0],
&s[0] + v.size() * sizeof(size_t),
reinterpret_cast<char *>(w.data()) );
IMO,代替使用std::string
如缓冲剂,只使用一个char
数组来保存序列化的数据。
实施例上ideone
strncpy
是失败的一个巨大的一堆。 它会提前终止您的输入,因为size_t
有一些零个字节,它解释为NULL终止,留给他们的默认构造0.如果你跑是机器在这个测试中,所有会0。使用std::copy
。
序列化此载体导入串,您首先要各自的该向量的元素的转换从int到含有该号码的ASCII表示相同的字符串,这种操作可以被称为一个int为字符串的序列化。
因此,例如,假设一个整数为10个,我们可以位数
// create temporary string to hold each element
char intAsString[10 + 1];
然后整数转换为字符串
sprintf(intAsString, "%d", v[0]);
要么
itoa( v[0], intAsString, 10 /*decimal number*/ );
您也可以使用ostringstream和<<操作的
如果你看intAsString和v的存储内容[0],它们是不同的,所述第一包含ASCII字母表示v [0]中的十进制数系统的值(基体10)而V包含[0]数字的二进制表示(因为这是电脑卖场如何号码)。
最安全的方法是只遍历矢量和单独存储的值到尺寸3 *的sizeof(为size_t)的字符数组。 这样,你不必对向量类实现的内部结构的依赖。