数据结构序列化

编码

编码是一种将信息或数据转换为特定格式的过程,以便在传输、存储或处理时能够被正确识别和理解。编码是将原始信息转换为数字、符号或其他形式的过程,以便在不同的系统、平台或设备之间进行交互和沟通

定长编码

编码的长度是固定的,只需要知道数据的个数再乘上每个数据的长度就可以知道总长度,例如字符串数组

变长编码

变长编码的目的是压缩信息,并非所有数据的长度都一致,例如 uint64 中存储小数的时候用到的信息非常短,于是就产生了一种变长编码方式,例如每7个bit为一组,最高位表示是否停止

序列化

序列化是一种将对象或数据转换为字节流或其他可存储格式的过程,以便在内存之外进行存储和传输。序列化的目的是将对象的状态或数据结构转换为一种紧凑、可读的形式,以便在需要时能够快速还原为原始对象

序列化分为元数据,索引段和数据段

元数据

存储着这段数据的有关信息,如类型,索引长度,数据长度等
将一段数据的元数据交给解码器,就可以进行自动解码了

索引段

存储着这段数据的索引,可以是偏移地址,布隆过滤器,或者其他一些数据,不同的索引对应不同的数据

数据段

数据段存放着索引对应的数据,数据段中的某一块也可以是一段序列化后的数据结构(可嵌套)

嵌套数据结构序列化

当进行数据结构嵌套的编码时,可以把当前类中的基本数据当作索引段,把拥有的子类当作数据段

反序列化

只需要拿到序列后对序列进行解码即可,注意一段数据的设计必须是便于解码的
反序列化的精髓在于需要在文件中提取信息时,可以通过索引快速提取到一段数据
更便捷的反序列化方式是只要拿到信息的开头,不用拿到信息的长度就可以将信息反序列化,那么我们要么记录变长信息的长度,要么对变长信息使用变长编码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
序列是将数据结构转换为可存储或传输的格式的过程,而反序列则是将序列后的数据重新转换为原始的数据结构的过程。在C语言中,我们可以通过使用字符数组来实现序列和反序列的功能。 以下是一个简单的C语言数据结构序列代码示例: ```c #include <stdio.h> #include <string.h> // 定义一个简单的数据结构 struct Person { char name[20]; int age; }; // 序列函数,将数据结构转换为字符串 void serialize(struct Person person, char* buffer) { sprintf(buffer, "%s,%d", person.name, person.age); } // 反序列函数,将字符串转换为数据结构 struct Person deserialize(char* buffer) { struct Person person; sscanf(buffer, "%[^,],%d", person.name, &person.age); return person; } int main() { struct Person person = {"Alice", 25}; char buffer[50]; serialize(person, buffer); printf("序列后的字符串: %s\n", buffer); struct Person newPerson = deserialize(buffer); printf("反序列后的数据结构: 名字:%s, 年龄:%d\n", newPerson.name, newPerson.age); return 0; } ``` 在上面的代码中,我们定义了一个简单的Person结构体,然后实现了序列和反序列函数。序列函数将Person结构体中的数据转换为字符串,然后可以进行存储或者传输。反序列函数将字符串重新转换为Person结构体的数据。最后在main函数中进行了序列和反序列的演示。 这是一个简单的C语言数据结构序列代码示例,可以根据实际情况进行扩展和优
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值