
flatcc十分钟入门用C语言实现FlatBuffers序列化的完整示例【免费下载链接】flatccFlatBuffers Compiler and Library in C for C项目地址: https://gitcode.com/gh_mirrors/fl/flatccFlatBuffers是一种高效的跨平台序列化库而flatcc则是专门为C语言设计的FlatBuffers编译器。如果你正在寻找一个快速、零拷贝的序列化解决方案flatcc无疑是C开发者的终极选择 本文将带你快速上手flatcc让你在十分钟内掌握用C语言实现FlatBuffers序列化的核心技巧。什么是FlatBuffers和flatccFlatBuffers是Google开发的一种高效的序列化格式它最大的优势是零拷贝访问——你可以在不解析整个缓冲区的情况下直接访问数据。而flatcc就是专门为C语言实现的FlatBuffers编译器它能够将FlatBuffers模式文件转换为C代码让你在C项目中轻松使用FlatBuffers的强大功能。flatcc的核心特性包括高性能直接内存访问无需解析开销小巧生成的代码体积小适合嵌入式系统纯C实现无需C运行时跨平台兼容性好支持JSON内置JSON解析和序列化功能快速开始安装与配置首先我们需要克隆并构建flatcc项目git clone https://gitcode.com/gh_mirrors/fl/flatcc cd flatcc scripts/initbuild.sh scripts/build.sh构建完成后你会得到两个关键工具bin/flatccFlatBuffers模式编译器lib/libflatccrt.a运行时库创建你的第一个FlatBuffers模式让我们从经典的Monster示例开始。创建一个名为monster.fbs的模式文件// monster.fbs namespace MyGame.Sample; enum Color:byte { Red 0, Green, Blue 2 } union Equipment { Weapon } struct Vec3 { x:float; y:float; z:float; } table Monster { pos:Vec3; mana:short 150; hp:short 100; name:string; friendly:bool false (deprecated); inventory:[ubyte]; color:Color Blue; weapons:[Weapon]; equipped:Equipment; } table Weapon { name:string; damage:short; } root_type Monster;生成C代码使用flatcc编译器生成对应的C头文件./bin/flatcc -a monster.fbs这个命令会生成多个文件monster_builder.h用于创建FlatBuffersmonster_reader.h用于读取FlatBuffersmonster_verifier.h用于验证缓冲区编写C代码创建Monster对象现在让我们看看如何用C代码创建一个Monster对象。以下是完整的示例代码#include stdio.h #include assert.h #include monster_builder.h int main() { flatcc_builder_t builder; void *buffer; size_t size; // 初始化构建器 flatcc_builder_init(builder); // 开始创建Monster对象 MyGame_Sample_Monster_start_as_root(builder); // 设置基本属性 MyGame_Sample_Monster_hp_add(builder, 80); MyGame_Sample_Monster_mana_add(builder, 150); // 创建位置结构 MyGame_Sample_Vec3_t *pos MyGame_Sample_Monster_pos_start(builder); pos-x 1.0f; pos-y 2.0f; pos-z -3.2f; MyGame_Sample_Monster_pos_end(builder); // 设置名称 MyGame_Sample_Monster_name_create_str(builder, MyMonster); // 创建武器列表 MyGame_Sample_Weapon_start_as_root(builder); MyGame_Sample_Weapon_name_create_str(builder, Sword); MyGame_Sample_Weapon_damage_add(builder, 10); flatbuffers_string_ref_t weapon1 MyGame_Sample_Weapon_end_as_root(builder); // 添加到武器向量 MyGame_Sample_Monster_weapons_start(builder); MyGame_Sample_Monster_weapons_push(builder, weapon1); MyGame_Sample_Monster_weapons_end(builder); // 完成Monster创建 MyGame_Sample_Monster_end_as_root(builder); // 获取最终的缓冲区 buffer flatcc_builder_finalize_aligned_buffer(builder, size); printf(成功创建FlatBuffer大小%zu 字节\n, size); // 清理资源 flatcc_builder_aligned_free(buffer); flatcc_builder_clear(builder); return 0; }读取和访问数据创建缓冲区后我们可以轻松地读取其中的数据#include monster_reader.h void read_monster(const void *buffer) { // 获取Monster对象 MyGame_Sample_Monster_table_t monster MyGame_Sample_Monster_as_root(buffer); if (!monster) { printf(无效的缓冲区\n); return; } // 读取基本属性 short hp MyGame_Sample_Monster_hp(monster); short mana MyGame_Sample_Monster_mana(monster); printf(Monster属性\n); printf( HP: %d\n, hp); printf( Mana: %d\n, mana); // 读取位置 MyGame_Sample_Vec3_struct_t pos MyGame_Sample_Monster_pos(monster); if (pos) { printf( 位置: (%.1f, %.1f, %.1f)\n, MyGame_Sample_Vec3_x(pos), MyGame_Sample_Vec3_y(pos), MyGame_Sample_Vec3_z(pos)); } // 读取名称 flatbuffers_string_t name MyGame_Sample_Monster_name(monster); if (name) { printf( 名称: %s\n, name); } }验证缓冲区完整性flatcc提供了强大的验证功能确保缓冲区数据的完整性#include monster_verifier.h int verify_buffer(const void *buffer, size_t size) { int ret MyGame_Sample_Monster_verify_as_root(buffer, size); if (ret ! 0) { printf(缓冲区验证失败: %s\n, flatcc_verify_error_string(ret)); return -1; } printf(缓冲区验证成功\n); return 0; }JSON支持序列化与反序列化flatcc还支持JSON格式的转换让你的数据更容易调试和传输#include monster_builder.h #include monster_reader.h // 从JSON创建FlatBuffer void create_from_json(flatcc_builder_t *B, const char *json) { MyGame_Sample_Monster_parse_json(B, json, strlen(json), 0); } // 将FlatBuffer转换为JSON void print_as_json(const void *buffer) { flatcc_json_printer_t printer; char *json; flatcc_json_printer_init(printer, NULL, 0); MyGame_Sample_Monster_print_json(printer, buffer); json flatcc_json_printer_get_buffer(printer); printf(JSON输出:\n%s\n, json); flatcc_json_printer_clear(printer); }实际应用示例网络通信让我们看一个实际的网络通信示例展示flatcc在真实场景中的应用// 发送数据 void send_monster_over_network(int socket_fd) { flatcc_builder_t builder; flatcc_builder_init(builder); // 创建Monster数据 MyGame_Sample_Monster_start_as_root(builder); MyGame_Sample_Monster_name_create_str(builder, NetworkMonster); MyGame_Sample_Monster_hp_add(builder, 100); MyGame_Sample_Monster_end_as_root(builder); // 获取缓冲区 void *buffer; size_t size; buffer flatcc_builder_get_direct_buffer(builder, size); // 发送数据先发送大小再发送数据 send(socket_fd, size, sizeof(size), 0); send(socket_fd, buffer, size, 0); flatcc_builder_clear(builder); } // 接收数据 void receive_monster_from_network(int socket_fd) { size_t size; void *buffer; // 接收数据大小 recv(socket_fd, size, sizeof(size), 0); // 分配缓冲区并接收数据 buffer malloc(size); recv(socket_fd, buffer, size, 0); // 验证并处理数据 if (verify_buffer(buffer, size) 0) { read_monster(buffer); } free(buffer); }性能优化技巧重用构建器对象多次使用时重置构建器比创建新的更高效直接缓冲区访问使用flatcc_builder_get_direct_buffer避免内存复制批量操作对于向量操作尽量使用批量添加方法内存对齐使用flatcc_builder_finalize_aligned_buffer确保正确对齐常见问题与解决方案问题1内存对齐错误解决方案始终使用flatcc_builder_finalize_aligned_buffer和flatcc_builder_aligned_free问题2字段顺序错误解决方案按照模式中定义的字段顺序添加数据或使用_create方法一次性设置所有字段问题3验证失败解决方案检查字段是否都正确设置特别是必填字段进阶功能探索1. 嵌套缓冲区flatcc支持嵌套的FlatBuffers适合复杂的数据结构// 创建嵌套的缓冲区 MyGame_Sample_Monster_start_as_nested_root(B, parent_builder); // ... 设置字段 ... flatbuffers_string_ref_t nested MyGame_Sample_Monster_end_as_nested_root(B);2. 类型安全验证使用类型标识符确保数据兼容性if (flatbuffers_get_type_hash(buffer) MyGame_Sample_Monster_type_hash) { // 类型匹配安全处理 }3. 自定义内存分配对于嵌入式系统可以自定义内存分配器flatcc_builder_custom_init(builder, custom_allocator, custom_emitter);总结flatcc为C语言开发者提供了一个强大而高效的FlatBuffers实现。通过本文的十分钟入门指南你应该已经掌握了✅安装和配置flatcc✅创建FlatBuffers模式文件✅生成C代码✅构建和读取FlatBuffers✅验证数据完整性✅JSON序列化支持flatcc的零拷贝特性和高效的内存使用使其成为游戏开发、物联网设备和嵌入式系统等性能敏感场景的理想选择。无论是处理网络协议还是存储配置文件flatcc都能提供出色的性能和易用性。现在就开始使用flatcc体验C语言中高效序列化的魅力吧官方文档doc/更多示例samples/测试代码test/记住flatcc不仅是一个库更是一种思维方式——在C语言的世界里效率和控制力可以完美共存【免费下载链接】flatccFlatBuffers Compiler and Library in C for C项目地址: https://gitcode.com/gh_mirrors/fl/flatcc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考