序列化、反序列化(C语言实现)

时间:2025-03-27 12:02:39
#include <>

static char fileBuffer[1000];

struct Object{
    int a;
    int b;
    char c;
};

typedef union _Serializater
{
    struct Object MyObject;
    char Buf[sizeof(struct Object)];
}Serializater;


void write(char *buf, int len)
{
    /* save to file */
    for (int i = 0; i < len; i++)
    {
        fileBuffer[i] = buf[i];
    }
}


void read(char *buf, int len)
{
    /* read from file */
    for (int i = 0; i < len; i++)
    {
        buf[i] = fileBuffer[i];
    }
}



int main()
{
    struct Object object1 = {
        .a = 1,
        .b = 2,
        .c = 3,
    };

    Serializater myWriteSerializater = {
        .MyObject = object1,
    };

    /* save object */
    write(, sizeof(object1));

    /* read */
    {
        Serializater myReadSerializater = {0};
        struct Object object2 = {0};
        read(, sizeof(object2));
        object2 = ;

        printf("object2 .a = %d, .b = %d, .c = %d\r\n", , , );
    }
}


        在某些场景下,我们需要对一些对象、结构体进行传输、保存,然后再接收或读取这些对象、结构体,恢复其中的信息。一般传输读写都是按字节操作,无法直接对结构体进行操作。

        本文借助union实现对象的序列化以及反序列化,提高了对象操作的便捷性。

有以下object1对象,若逐个对其中的成员进行保存/传输,会变得十分麻烦。

struct Object object1 = {
        .a = 1,
        .b = 2,
        .c = 3,
};

借助myWriteSerializater进行转换,直接赋值给myWriteSerializater的成员MyObject,由于union共享内存的特性,会自动转换成Buf字节数组,直接对Buf传输保存即可(结构体对齐方式也无需关心,填充字节一样会进行操作)。

 Serializater myWriteSerializater = {
        .MyObject = object1,
    };

    /* save object */
    write(, sizeof(object1));

读取的时候相反,

    /* read */
    {
        Serializater myReadSerializater = {0};
        struct Object object2 = {0};
        read(, sizeof(object2));
        object2 = ;

        printf("object2 .a = %d, .b = %d, .c = %d\r\n", , , );
    }

write/read读写这里用fileBuf模拟,换成真正的读写函数即可。