矢量系列化(vector serialization)

2019-06-26 01:49发布

我试图二进制序列化矢量数据。 在此示例下面我序列化到一个字符串,然后反序列化回为矢量,但不要让我开始用相同的数据。 为什么会出现这样的情况?

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 )

Answer 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



Answer 2:

strncpy是失败的一个巨大的一堆。 它会提前终止您的输入,因为size_t有一些零个字节,它解释为NULL终止,留给他们的默认构造0.如果你跑是机器在这个测试中,所有会0。使用std::copy



Answer 3:

序列化此载体导入串,您首先要各自的该向量的元素的转换从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]数字的二进制表示(因为这是电脑卖场如何号码)。



Answer 4:

最安全的方法是只遍历矢量和单独存储的值到尺寸3 *的sizeof(为size_t)的字符数组。 这样,你不必对向量类实现的内部结构的依赖。



文章来源: vector serialization