gpt4 book ai didi

c++ - 自定义序列化

转载 作者:太空狗 更新时间:2023-10-29 21:32:37 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com