序列化、反序列化(C语言实现) |
您所在的位置:网站首页 › php序列化和反序列化作用 › 序列化、反序列化(C语言实现) |
#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 |