c++中的简单序列化示例

Simple serialization example in c++

本文关键字:序列化 简单 c++      更新时间:2023-10-16

我有以下结构:

typedef struct{
    int test;
    std::string name;
} test_struct;

然后,我在主功能中有以下代码:

int main(int argc, char *argv[]){
    test_struct tstruct;
    tstruct.test = 1;
    tstruct.name = "asdfasdf";
    char *testout;
    int len;
    testout = new char[sizeof(test_struct)];
    memcpy(testout, &tstruct, sizeof(test_struct) );
    std::cout<< testout;
}

但是,没有打印任何内容。怎么了?

sizeof(std::string)总是生成相同的值。它不会提供字符串的运行时长度。要使用memcpy进行序列化,请将结构更改为包含char-array(如char buffer[20]),或者通过在结构上定义一个方法来计算所需序列化缓冲区的大小,该方法提供字节的运行时长度。如果要使用std::string这样的成员,则需要遍历结构的每个成员并进行序列化。

memcpy(testout, (void *)&tstruct.test,  sizeof(int) );
memcpy(testout+sizeof(int), tstruct.name.c_str(),tstruct.name.length() );

在这种情况下,针对整个结构的memcpy将不起作用。

尝试NULL终止字符串并同时发出换行符:

testout = new char[sizeof(test_struct) + 1];
memcpy(testout, &tstruct, sizeof(test_struct));
testout[sizeof(test_struct)] = '';
std::cout<< testout << std::endl;

然而,正如user3543576所指出的,从这个过程中获得的序列化不会太有用,因为它将包含字符缓冲区的内存地址,而不是实际的字符串本身。