c++ - vector 序列化

标签 c++ serialization vector

我正在尝试对 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/

相关文章:

java - java ObjectOutputStream方法的defaultWriteObject和writeObject之间的异同

C++:自定义对象序列化/反序列化失败

c# - 序列化和反序列化不适用于字典作为支持字段

java - 如何在android模拟器上显示Mat图像?使用NDK

serialization - 如何在 Jackson 中使用自定义 id 序列化器?

c++ - 我应该使用什么类型的容器来存储我的 ObjectID 整数?

C++ 复制直到算法

c++ - C++ 中的 Bignum vector 用法

c# - Unity插件:编码(marshal)C++ double *将C#中的数组翻倍

c++ - 嵌套类 C++ 中的可访问性和可见性