自定义序列化

弗朗西

我有一个容器类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值。怎么了?

dbush

您没有复制您认为要复制的内容:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章