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

您所在的位置:网站首页 php序列化和反序列化作用 序列化、反序列化(C语言实现)

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

2023-08-22 17:43| 来源: 网络整理| 查看: 265

#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(myWriteSerializater.Buf, sizeof(object1)); /* read */ { Serializater myReadSerializater = {0}; struct Object object2 = {0}; read(myReadSerializater.Buf, sizeof(object2)); object2 = myReadSerializater.MyObject; printf("object2 .a = %d, .b = %d, .c = %d\r\n", object2.a, object2.b, object2.c); } }

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

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

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

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

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

Serializater myWriteSerializater = { .MyObject = object1, }; /* save object */ write(myWriteSerializater.Buf, sizeof(object1));

读取的时候相反,

/* read */ { Serializater myReadSerializater = {0}; struct Object object2 = {0}; read(myReadSerializater.Buf, sizeof(object2)); object2 = myReadSerializater.MyObject; printf("object2 .a = %d, .b = %d, .c = %d\r\n", object2.a, object2.b, object2.c); }

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3