typ*_*def 6 c++ serialization 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;
}
Run Code Online (Sandbox Code Playgroud)
我希望得到输出
1
2
3
Run Code Online (Sandbox Code Playgroud)
而是获得输出
1
0
0
Run Code Online (Sandbox Code Playgroud)
(关于gcc-4.5.1)
错误出现在对 的调用中strncpy。从链接页面:
如果src的长度小于n, strncpy() 会用空字节填充 dest 的剩余部分。
0因此,在找到序列化数据中的第一个字节后,w数据数组的其余部分将用0s 填充。
要解决此问题,请使用for循环,或者std::copy
std::copy( &s[0],
&s[0] + v.size() * sizeof(size_t),
reinterpret_cast<char *>(w.data()) );
Run Code Online (Sandbox Code Playgroud)
IMO,不使用std::string缓冲区,而是使用char数组来保存序列化数据。
ideone 上的示例