我有一个容器类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。在send方法中,我不会取回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 **
。您还可以B
使用的第一个实例覆盖的实例A
。
你已经有一个指针你要复制的数据,所以直接传递那些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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句