在C语言开发中,C语言序列化是一个非常重要的概念。它指的是将内存中的数据结构(如结构体、数组等)转换为可以存储或传输的格式(通常是字节流),以便后续能还原成原始数据。这对于C语言数据存储、配置文件保存、网络通信等场景至关重要。
序列化(Serialization)就是把程序运行时的内存对象转换成一种可以持久化(比如写入文件)或通过网络传输的格式。反序列化(Deserialization)则是相反的过程——从存储介质中读取数据并重建原始对象。
最简单的C语言结构体序列化方式是直接使用标准库函数 fwrite() 和 fread() 将结构体以二进制形式写入文件。但要注意:这种方法仅适用于没有指针成员的“纯”结构体,并且不同平台的字节序和对齐方式可能影响兼容性。
#include <stdio.h>#include <string.h>// 定义一个学生结构体typedef struct { int id; char name[32]; float score;} Student;// 序列化:将结构体写入二进制文件void serialize_student(const Student* s, const char* filename) { FILE* fp = fopen(filename, "wb"); if (fp == NULL) { perror("无法打开文件进行写入"); return; } fwrite(s, sizeof(Student), 1, fp); fclose(fp); printf("学生信息已序列化保存到 %s\n", filename);}// 反序列化:从二进制文件读取结构体int deserialize_student(Student* s, const char* filename) { FILE* fp = fopen(filename, "rb"); if (fp == NULL) { perror("无法打开文件进行读取"); return -1; } size_t result = fread(s, sizeof(Student), 1, fp); fclose(fp); if (result != 1) { printf("读取失败或文件不完整\n"); return -1; } return 0;}int main() { // 创建一个学生实例 Student stu = {1001, "张三", 92.5f}; // 序列化 serialize_student(&stu, "student.dat"); // 清空原结构体 memset(&stu, 0, sizeof(stu)); // 反序列化 if (deserialize_student(&stu, "student.dat") == 0) { printf("反序列化成功!ID: %d, 姓名: %s, 成绩: %.2f\n", stu.id, stu.name, stu.score); } return 0;} 虽然上述方法简单直接,但在实际应用中需注意以下几点:
sizeof 不一致。可使用 #pragma pack 控制对齐。对于复杂项目,建议采用文本格式(如 JSON、XML)或自定义协议。虽然 C 语言标准库不直接支持这些格式,但可以借助第三方库(如 cJSON)或手动拼接字符串实现。
不过,对于嵌入式系统或性能敏感场景,C语言二进制文件操作仍是首选,因其高效且无需额外解析开销。
本文介绍了 C 语言中最基础也最常用的序列化方法——通过 fwrite/fread 直接操作二进制文件。这种方法适合初学者理解和实践 C语言序列化 的核心思想。掌握它,你就迈出了数据持久化的第一步!
记住:在真实项目中,务必考虑可移植性、安全性与扩展性。随着经验积累,你可以探索更高级的序列化技术,如 Protocol Buffers 或自定义 TLV(Type-Length-Value)协议。
本文由主机测评网于2025-12-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025128227.html