【Unix】FlatBuffers 在 C++ 项目中的使用教程

在 C++ 项目中使用 FlatBuffers 主要涉及以下几个步骤:

1. 安装 FlatBuffers

首先,你需要在你的系统上安装 FlatBuffers 编译器和库。你可以从 FlatBuffers 的 GitHub 仓库 下载源码并编译:

git clone https://github.com/google/flatbuffers.git
cd flatbuffers
cmake -G "Unix Makefiles"
make

完成后,你将获得一个 flatc 编译器,这是用于将 FlatBuffers schema 文件(.fbs 文件)转换为各种支持的语言的源代码的工具。

2. 定义 Schema

创建一个 FlatBuffers schema 文件(扩展名为 .fbs)。这个文件定义了你想要序列化的数据结构。例如:

// example.fbs
namespace MyGame.Sample;table Monster {id:int;name:string;inventory:[ubyte];  // Vector of unsigned bytes
}root_type Monster;

3. 生成 C++ 源代码

使用 flatc 编译器从你的 schema 文件生成 C++ 绑定代码:

flatc -c example.fbs

这会生成一些 C++ 文件,这些文件提供了操作定义的 FlatBuffers 数据结构的 API。

4. 在项目中使用 FlatBuffers

将生成的代码和 FlatBuffers 的包含文件添加到你的 C++ 项目中。你需要包括 FlatBuffers 的库路径和头文件路径在你的编译设置中。

5. 读写 FlatBuffers 数据

写入数据

在 C++ 中构建和序列化 FlatBuffers 数据:

#include "example_generated.h"  // 自动生成的头文件flatbuffers::FlatBufferBuilder builder;auto name = builder.CreateString("Orc");
auto inventory = builder.CreateVector(std::vector<uint8_t>({1, 2, 3, 4}));auto orc = MyGame::Sample::CreateMonster(builder, 123, name, inventory);
builder.Finish(orc);// 获取生成的数据和大小
uint8_t *buf = builder.GetBufferPointer();
int size = builder.GetSize();  // 使用这些数据

代码解读:

  1. 包含生成的头文件
#include "example_generated.h"  // 自动生成的头文件

这行代码包含了由 FlatBuffers 编译器 (flatc) 根据你的 .fbs schema 文件自动生成的 C++ 头文件。这个头文件中定义了与 schema 中定义的数据结构对应的 C++ 类和方法。

  1. 初始化 FlatBufferBuilder
flatbuffers::FlatBufferBuilder builder;

这行代码创建了一个 FlatBufferBuilder 对象,名为 builder。FlatBufferBuilder 是用于构建 FlatBuffer 二进制缓冲区的主要工具。这个对象会管理内存分配,并最终产生一个二进制缓冲区,其中包含序列化的数据。

  1. 创建字符串
auto name = builder.CreateString("Orc");

这行代码使用 builder 对象创建了一个 FlatBuffers 字符串。这里,字符串 “Orc” 被添加到构建中的 FlatBuffers 中,并返回一个指向这个 FlatBuffers 字符串的引用。

  1. 创建向量
auto inventory = builder.CreateVector(std::vector<uint8_t>({1, 2, 3, 4}));

这行代码创建了一个类型为 uint8_t 的向量,并将其内容初始化为 {1, 2, 3, 4}。然后,它使用 builder 将这个向量添加到 FlatBuffer 中,并返回一个指向 FlatBuffers 中向量的引用。

  1. 构建 Monster 对象
auto orc = MyGame::Sample::CreateMonster(builder, 123, name, inventory);

这行代码调用一个由 FlatBuffers 自动生成的函数 CreateMonster,这个函数根据给定的参数构造 Monster 对象。这里传递的参数包括 builder、一个整数 ID (123)、前面创建的 name 字符串引用和 inventory 向量引用。

  1. 完成构建过程
builder.Finish(orc);

这行代码标记 FlatBuffers 构建的完成,这里的 orc 是 Monster 对象在 FlatBuffer 中的引用。调用 Finish 方法后,FlatBuffer 中的数据布局被最终确定,并准备好序列化输出。

  1. 获取缓冲区指针和大小
uint8_t *buf = builder.GetBufferPointer();
int size = builder.GetSize();  // 使用这些数据

这两行代码获取生成的 FlatBuffers 二进制数据的指针和大小。buf 是指向 FlatBuffers 缓冲区起始位置的指针,size 是缓冲区的字节大小。这些信息通常用于将序列化的数据发送到文件、网络或其他存储和通信媒介。

这段代码代码整体的作用就是使用 FlatBuffers 在 C++ 中定义、填充并序列化一个复杂的数据结构。这种序列化的数据可以高效地进行存储或网络传输,并且可以在不需要解析整个结构的情况下直接访问特定字段,这是 FlatBuffers 设计的一大优势。

读取数据

解析 FlatBuffers 数据:

#include "example_generated.h"  // 自动生成的头文件void ReadMonster(const uint8_t *buf) {auto monster = MyGame::Sample::GetMonster(buf);std::cout << "Monster ID: " << monster->id() << std::endl;std::cout << "Monster Name: " << monster->name()->str() << std::endl;auto inv = monster->inventory();if (inv) {std::cout << "Inventory: ";for (auto it = inv->begin(); it != inv->end(); ++it) {std::cout << int(*it) << ' ';}std::cout << std::endl;}
}// 调用
ReadMonster(buf);

6. 链接 FlatBuffers 库

在编译你的项目时,确保链接了 FlatBuffers 库。如果你是在一个典型的 Makefile 或 CMake 项目中工作,你需要添加相应的库路径和链接器标志。

完成这些步骤后,你的 C++ 项目就能够使用 FlatBuffers 进行高效的数据序列化和解析了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA |数组】数组定义与使用、常见的Arrays类介绍

目录 一、前言 二、数组的创建和初始化 三、数组的使用 四、数组是引用类型 1.JVM的内存分配 2.与引用类型变量 3.null 五、二维数组 六、Java中Arrays类的常用方法 1. Arrays.fill ->填充数组 2. Arrays.sort ->数组排序 3. Arrays.toString ->数组打印 …

美易官方:美国经济已现裂痕?美联储再不降息,崩溃即将到来!

美国经济&#xff0c;一度被誉为全球最强大的经济体&#xff0c;如今似乎已显露出脆弱的迹象。华尔街的分析师们纷纷发出警告&#xff0c;呼吁美联储尽快降息&#xff0c;否则一场经济崩溃可能即将来临。 自美联储大幅加息以来&#xff0c;经济学家们一直警告称&#xff0c;高利…

那个在买珠宝的年轻人

金价搭上过山车&#xff0c;今年以来价格一路飙涨。 珍珠身价同步飙升&#xff0c;晋级珠宝圈“新宠”。 文玩圈“减龄”&#xff0c;盘珠串不再只是“老头乐”。 月薪3000的年轻人&#xff0c;悄悄实现“宝石”自由。 黄金珠宝走俏&#xff0c;这届年轻人到底有着怎样的珠宝…

开抖音小店需要交多少保证金?全类目选择,一篇了解

哈喽~我是电商月月 做抖音小店前大家都会搜索“入驻抖音小店需要准备什么东西&#xff1f;”其中就包含了一项&#xff1a;类目保证金的缴纳 那到底要交多少钱&#xff1f;很多新手朋友还是不太了解 今天我就给大家解答这个问题&#xff0c;首先&#xff0c;我们要知道抖店的…

高并发-线程池

文章目录 高并发-线程池2024心得好的博客必会面试题为什么使用线程池线程池的实现原理线程池的拒绝策略阻塞队列已满&#xff0c;在提交任务会发生什么问题threadlocal原理和使用多线程配置 高并发-线程池2024 心得 面试都是围绕着三高展开&#xff0c;高并发&#xff0c;高可…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09; 2024 International Conference on Virtual Reality, Image and Signal Processing&#xff08;ICVISP 2024&#xff09; 会议基本信息 会议时间&#xff1a;2024年8月2-4日 会议地点&#x…

2024年5月软考,别再傻傻啃书了!

备考2024年软考&#xff0c;不听课也不刷题&#xff0c;只是看教材的话&#xff0c;想要考试通过&#xff0c;几乎是不可能的&#xff0c;特别是基础比较薄弱的考生。 为什么只看教材通不过&#xff1f; 如果只是把教材从头到尾看一遍&#xff0c;毫无目的地看书&#xff0c;…

数据结构-线性表-应用题-2.2-5

从顺序表中删除其值在给定值s与t之间&#xff08;包括s和t&#xff0c;且s<t&#xff09;的所有元素&#xff0c;若s或t不合理或顺序表为空&#xff0c;则显示出错信息并退出运行。 从前往后扫描顺序表L&#xff0c;用k记录元素值在[s,t]的元素的个数&#xff0c;对于不在其…

FPGA学习笔记(1)——Vivado和HLS

1 Vivado设计 1.1 FPGA基本知识 Xilinx Atrix-7使用6输入LUT结构&#xff08;0-63&#xff09;CLB&#xff1a;可配置逻辑块Slice&#xff1a;每个CLB包含2个Slice(包含查找表LUT和8位寄存器REG)布线池&#xff1a;围绕在CLB周围&#xff0c;衔接FPGA的资源调度I/O块&#xf…

代码随想录35期Day32-Java

Day32题目 LeetCode122.买股票的最佳时机 核心思想&#xff1a;很简单&#xff0c;只要第二天比第一天贵&#xff0c;就第一天买入&#xff0c;第二天卖出 class Solution {public int maxProfit(int[] prices) {// 只要后一天比这一天价钱高就买&#xff0c;然后第二天卖出…

okcc呼叫中心为什么软电话已经注册,但是坐席监控却显示离线?

这种情况可能有几种可能的原因&#xff1a; 网络连接问题&#xff1a; 坐席监控系统可能无法正常与软电话建立连接&#xff0c;这可能是由于网络故障、防火墙设置或路由问题等引起的。 配置错误&#xff1a; 可能存在软电话配置或坐席监控系统配置方面的错误&#xff0c;导致无…

Qt宏和关键字

Q_GADGET 这个宏是Q_OBJECT宏的弱化版本吧&#xff0c;不过它可以继续 使用属性机制、反射等特性&#xff0c;但是不能使用信号与槽QT_INCLUDE_COMPAT 兼容版本QT_BEGIN_NAMESPACE 防止命名污染Q_GUI_EXPORT 为了实现跨平台以及插件Q_FLAG(RenderHint)&#xff0c;Q_DECLARE_FL…

test我说话撒机房环境

testhfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.ztesthfsjafjdsbzvbcxn.z

启动配置 BOOT

在STM32F10xxx里&#xff0c;可以通过BOOT[1:0]引脚选择三种不同启动模式。 STM32微控制器实现了一个特殊的机制&#xff0c;系统可以不仅仅从Flash存储器或系统存储器启动&#xff0c;还可以从内置SRAM启动。 根据选定的启动模式&#xff0c;主闪存存储器、系统存储器或SRAM可…

centos常用命令介绍

CentOS是一个基于Linux的开源操作系统&#xff0c;它提供了大量的命令和工具&#xff0c;用于管理和配置系统。以下是一些CentOS中常用的命令及其简要介绍&#xff1a; 查看系统信息&#xff1a; uname -a&#xff1a;查看内核/操作系统/CPU信息。 head -n 1 /etc/issue&…

基于 docker-compose 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 3、Mysql 3.1 建立工作目录并上传相关安装包 3.2 编写 Mysql Dockerfile 脚本 3.3 编写 my.cnf 配置文件 4、PHP 4.1 建立工作目录…

系统图表:洞察数据的价值与魅力

在数字化、信息化迅猛发展的今天&#xff0c;数据已经成为企业决策、科学研究、社会管理等领域的核心资源。而如何高效、准确地理解和利用这些数据&#xff0c;成为摆在我们面前的重要课题。系统图表作为数据可视化的重要呈现工具&#xff0c;不仅能帮助我们洞察数据的内在规律…

【Python】字典题

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) for key,value in dic.i…

副业自媒体变现建议详解

大家好&#xff0c;我是来自AI破局俱乐部。针对这位匿名用户的问题&#xff0c;我将为大家提供更详细的副业自媒体变现建议。 【痕迹】QQ微信朋友圈和聊天记录分析工具1.0.3 &#xff08;1&#xff09;纯Python语言实现&#xff0c;使用Flask后端&#xff0c;本地分析&#xff…

计算机体系结构:6、指令流水线

6.指令流水线 6.1 流水线概述 6.1.1 流水线的执行效率 ​ 一条指令的执行过程可被分为若干阶段&#xff0c;每个阶段由相应的功能部件完成。一般而言&#xff0c;一条指令的流水线由如下5个流水段组成&#xff1a; 取指令(IF):从存储器取指令指令译码(ID):产生指令执行所需…