我正在尝试对 vector 数据进行二进制序列化。在下面的这个示例中,我序列化为一个字符串,然后反序列化回一个 vector ,但没有得到与我开始时相同的数据。为什么会这样?
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
的调用中.从链接页面:
If the length of src is less than n, strncpy() pads the remainder of dest with null bytes.
因此,在序列化数据中找到第一个 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
数组来保存序列化数据。
Example在ideone上
关于c++ - vector 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353642/