c++ - 自定义序列化

标签 c++

我有一个 B 类容器,它有一定数量的 A 项。我想对其进行序列化,以便通过网络发送或将其保存到磁盘。

class A {
public:
    bool b;
    long c;
};

struct B {
public:
    int na;
    bool bb;
    A** a;
};
void send(unsigned char* ptr, int sizeb) {
    int i = sizeof(B);
    B* b = new B();
    b->a = (A**)malloc((int)*ptr * sizeof(A*));
    while (i < sizeb) {
        memcpy(b->a[i], ptr + i, sizeof(A));
        i += sizeof(A);
    }
}

B 的第一个成员是包含的 A 项目的数量。在本例中是三个。

int main()
{
    B* b = new B();
    b->na = 3;
    b->bb = true;
    b->a = (A**)malloc(b->na *sizeof(A*));
    for (int i = 0; i < b->na; i++) {
        b->a[i] = new A();
        b->a[i]->b = true;
        b->a[i]->c = (i+1) * 100;
    }
    int sizeb = sizeof(B) + b->na * sizeof(A);
    unsigned char* ptr = (unsigned char*)malloc(sizeb);
    memcpy(ptr, (unsigned char*)&b, sizeof(B));
    for (int i = 0; i < b->na; i++)
        memcpy(ptr+i*sizeof(A), (unsigned char*)&b->a[i], sizeof(A));
    send(ptr, sizeb);
    return 0;
}

首先,我分配了足够的连续空间来存储 B 和三个 A。在发送方法中,我没有取回 na 值。怎么了?

最佳答案

您没有复制您认为正在复制的内容:

memcpy(ptr, (unsigned char*)&b, sizeof(B));
for (int i = 0; i < b->na; i++)
    memcpy(ptr+i*sizeof(A), (unsigned char*)&b->a[i], sizeof(A));

b 已经是一个指向 B 的指针,所以当你获取它的地址时,你现在就有了一个 B **&b->a[i] 的计算结果也是 A **。您还用 A 的第一个实例覆盖了 B 的实例。

您已经有了指向要复制的数据的指针,因此将它们直接传递给 memcpy,并将 sizeof(b) 添加到 ptr 添加 A 的实例时。

memcpy(ptr, b, sizeof(B));
for (int i = 0; i < b->na; i++)
    memcpy(ptr+sizeof(B)+i*sizeof(A), b->a[i], sizeof(A));

然后在您的send 函数中,您不会反序列化B 的实例。您也需要这样做。

B* b = new B();
memcpy(b, ptr, sizeof(b);

关于c++ - 自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54449068/

相关文章:

c++ - 将负 const double 转换为 unsigned 结果为 0 而 non-const double 很好

C++ 禁止从 const char* 设置 char* 和 char[]

c++ - 如何测试只返回系统值的API?

c++ - 使用 Peterson 的 N 进程算法的信号量实现

C++ gmp 和 Homebrew 软件

c++ - 为物理引擎写入 'ON' 事件

c++ - cmake3 : set path to mpi headers

c++ - 注入(inject) DLL 时,Explorer.exe 在启动时死锁

c++ - OpenMP:是使用更少的长线程更好,还是使用最大可用的短线程更好?

c++ - Win32 GUI 程序中的布局