flatbuffer使用教程

一、定义scheme

Tables

FlatBuffers 中定义对象的主要方式,由名称和字段列表组成。每个字段都有一个名称、一个类型和一个可选的默认值。
如果架构中未指定默认值,则标量类型的默认值将为 0 ,其他类型的默认值将为 null 。

  • 限制
  1. 只能在表定义的末尾在架构中添加新字段,如果您希望灵活地在架构中使用任何顺序的字段,您可以手动分配 id。
  2. 无法从架构中删除不再使用的字段,但您可以简单地停止将它们写入数据中以获得几乎相同的效果。此外,您可以将它们标记为 deprecated
  3. 如果您可以更改代码,则可以更改字段名称和表名称,直到您也在那里重命名它们为止。

Structs

与表类似,只是现在没有任何字段是可选的(因此也没有默认值),并且不能添加或弃用字段。结构体只能包含标量或其他结构体。将此用于您非常确定不会进行任何更改的简单对象。
结构比表使用更少的内存,并且访问速度更快

Types

  • 内置类型

    • 8 bit: byte (int8), ubyte (uint8), bool
    • 16 bit: short (int16), ushort (uint16)
    • 32 bit: int (int32), uint (uint32), float (float32)
    • 64 bit: long (int64), ulong (uint64), double (float64)
      其中括号中的类型名称是别名
  • 内置非标量类型:

  • [type]

  • string 只能保存 UTF-8 或 7 位 ASCII。对于其他文本编码或一般二进制数据,请使用向量 [byte]

一旦使用字段,您就无法更改它们的类型,但相同大小的数据除外

Array

数组是固定长度元素集合的便捷简写。

  • 比如说:
struct Vec3 {x:float;y:float;z:float;
}
  • 可以替换为:
struct Vec3 {v:[float:3];
}

默认值、可选值和必需值

枚举

定义一系列命名常量,每个常量都有一个给定值,或者比前一个值增加 1。默认的第一个值为 0 。

通常,枚举值只能被添加,不能被删除(枚举不会被弃用)。这需要代码通过处理未知的枚举值来处理自身的前向兼容性。

工会(Unions)

联合与枚举共享许多属性,但您使用表名称而不是常量的新名称。然后,您可以声明一个联合字段,它可以保存对任何这些类型的引用,此外还会生成一个后缀为 _type 的字段,该字段保存相应的枚举值,让您知道要转换哪种类型到运行时。

namespace

仅C++和java代码生成的时候有这个概念。

其它

  • Root Type
    这声明了您认为是序列化数据的根表。这对于解析不包含对象类型信息的 JSON 数据尤其重要。

二、在C++中使用

schema

namespace dshengChen;enum Color : byte { Red = 1, Green, Blue }struct Son {x:float;y:float;z:float;
}table Monster {son:Son;name:string;age:uint8;color:Color = Blue;
}root_type Monster;

使用指令: 将schema编译为c++版本和python版本的代码。

flatc --cpp -o output_folder_path schema_path
flatc --python -o output_folder_path schema_path

序列化

FlatBuffers 的核心是内存效率,这就是为什么它的基本 API 是围绕使用尽可能少的内存而编写的。这确实使 API 变得更加笨拙(需要对所有数据进行预序构建,并使突变变得更加困难)。


void serialization_data(string user_name, uint8_t user_age)
{flatbuffers::FlatBufferBuilder builder;auto name = builder.CreateString(user_name);dshengChen::Son son(0.1, 0.2, 0.3);auto m = dshengChen::CreateMonster(builder, &son, name, user_age, dshengChen::Color_Green);builder.Finish(m);// 获取 FlatBuffer 数据指针和大小const uint8_t *buffer = builder.GetBufferPointer();size_t size = builder.GetSize();std::ofstream outfile(filePath, std::ios::binary);std::vector<char> data(size);std::memcpy(data.data(), buffer, size);outfile.write(data.data(), size);outfile.close();
}

反序列化

void deserialization_data()
{ifstream in_file(filePath, std::ios::binary);if (in_file.is_open()){in_file.seekg(0, std::ios::end);std::streamsize fileSize = in_file.tellg();in_file.seekg(0, std::ios::beg);// 读取文件内容到缓冲区std::vector<char> buffer(fileSize);in_file.read(buffer.data(), fileSize);using namespace dshengChen;auto parsed_person = GetMonster(buffer.data());int age = parsed_person->age();Color c = parsed_person->color();cout << "\t age is: " << age;cout << "\t name is: " << parsed_person->name()->c_str();cout << "\t color is: " << (int)c << endl;}// 关闭文件in_file.close();
}

c++ flatbuffer的cmake工程

cmake_minimum_required(VERSION 3.6)
project(py11_t VERSION 0.1.0 LANGUAGES C CXX)set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 17)include(CPack)include(FetchContent)
FetchContent_Declare(flatbuffersGIT_REPOSITORY https://github.com/google/flatbuffers.gitGIT_TAG v23.5.26
)
FetchContent_MakeAvailable(flatbuffers)include_directories("./generated")
add_executable(run_e test.cpp)
target_link_libraries(run_e PRIVATE flatbuffers)# flatc --cpp ./example.fbs -o generated

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

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

相关文章

比尔盖茨最新文章——AI 将彻底改变计算机的使用形式

最近发现比尔盖茨还在写文章&#xff0c;确实了不起&#xff0c;68 岁的老人家还在坚持输出&#xff0c;除了写文章&#xff0c;比尔盖茨还致力于教育、医疗和卫生等慈善工作&#xff0c;奋斗在一线&#xff0c;看来美国人也延迟退休啊 &#x1f605; 原文《AI 将彻底改变计算…

Java数据结构篇——单链表的基本操作

1. 前言 在上一篇《Java数据结构篇——实现顺序表的增删查改》&#xff0c;我们已经熟悉了 ArrayList 的使用并且进行了简单的模拟实现。ArrayList底层使用数组来存储元素&#xff0c;由于其底层是一段连续的空间&#xff0c;当ArrayList 任意位置插入或者删除元素时&#xff…

《使用ThinkPHP6开发项目》 - 登录接口一

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 《使用ThinkPHP6开发项目》 - 创建应用-CSDN博客 《使用ThinkPHP6开发项目》 - 创建控制器-CSD…

详解Keras3.0 Layers API: Convolution layers(Conv1D、Conv2D、Conv3D)

1、Conv1D layer 通常对一维度数组&#xff08;例&#xff1a;arr np.array([1, 2, 3, 4, 5])&#xff09;进行卷积操作 keras.layers.Conv1D(filters,kernel_size,strides1,padding"valid",data_formatNone,dilation_rate1,groups1,activationNone,use_biasTrue,…

职场记6:在国企工作,追逐挑战与成就

上一篇《职场记5&#xff1a;勇闯深圳&#xff0c;追梦职场》 上回说到我决定入职一家国企&#xff0c;去入职后才发现&#xff0c;我应聘的岗位其实只招一人&#xff0c;加上我却一共来了两个人&#xff0c;也就是说我和另一个新人最终要有一个离开。 尽管我和他有着一定的竞…

SystemVerilog基础:并行块fork-join、join_any、join_none(二)

相关阅读 SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html 在第一节中&#xff0c;我们讨论了并行块中的fork-join块和fork-join_any块&#xff0c;了解了它们的差异&#xff0c;本文将继续讨论fork-join_none块的使用。 fork-join_none并行块…

12.12_黑马数据结构与算法笔记Java

目录 079 优先级队列 无序数组实现 080 优先级队列 有序数组实现 081 优先级队列 堆实现 1 082 优先级队列 堆实现 2 083 优先级队列 堆实现 3 084 优先级队列 e01 合并多个有序链表1 084 优先级队列 e01 合并多个有序链表2 085 阻塞队列 问题提出 086 阻塞队列 单锁实…

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具&#xff0c;它能够帮助用户更好地了解和使用产品&#xff0c;提高用户体验。然而&#xff0c;创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法&#xff0c;帮助企业更好地为…

Linux: network:tcp: option: TCP_INFO

https://www.man7.org/linux/man-pages/man7/tcp.7.html https://www.man7.org/linux/man-pages/man8/ss.8.html 从TCP的使用手册上看,这个选项的作用是返回一个结构体数据。2.4 就引入了,其实大家可以用起来这个选项。 TCP_INFO (since Linux 2.4) Used to collect informa…

【JavaWeb学习笔记】10 - 手写Tomcat底层,Maven的初步使用

一、Maven 1.Maven示意图 类似Java访问数据库 2.创建Maven案例演示 配置阿里镜像 找到setting目录 但一开始配置不存在该文件 需要去Maven主目录下的conf拿到settings拷贝到上述目录 拷贝到admin/.m2后打开该settings 在<mirrors>内输入镜像地址 <mirror> …

C语言—每日选择题—Day52

第一题 1. 执行c程序代码&#xff0c;a,b,c,d的值分别为&#xff08;&#xff09; int a 1; int b 0; int c 0; int d (a) * (c 1); A&#xff1a;2&#xff0c;0&#xff0c;1&#xff0c;2 B&#xff1a;1&#xff0c;0&#xff0c;1&#xff0c;1 C&#xff1a;2&…

Docker--Docker镜像仓库

一、搭建私有镜像仓库 搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址&#xff1a;https://hub.docker.com/_/registry &#xff08;一&#xff09;简化版镜像仓库 Docker官方的Docker Registry是一个基础版本的Docker镜像仓库&#xff0c;具备仓库…

线下实体门店引流,百万私域电商高手都在用的实战营销引流技巧!

线下实体门店引流&#xff0c;百万私域电商高手都在用的实战营销引流技巧&#xff01; 无论是初创公司还是已经在步入正轨的实体门店&#xff0c;有个现实的实例告诉你&#xff1a;互联网上90%的引流技巧告诉你的方法&#xff0c;其实都是不挣钱的&#xff0c;辛辛苦苦折腾一整…

大数据技术之Shell(超级详细)

大数据技术之Shell&#xff08;超级详细&#xff09; 第1章 Shell概述 Shell 是一种脚本语言&#xff0c;用于在操作系统的命令行界面&#xff08;CLI&#xff09;下执行命令和脚本。在大数据领域&#xff0c;Shell 脚本常用于编写数据处理和分析任务的自动化脚本&#xff0c…

Redis设计与实现之对象处理机制

目录 一、前言 二、对象处理机制 1、redisObject 数据结构&#xff0c;以及 Redis 的数据类型 2、 命令的类型检查和多态 3、对象共享 4、引用计数以及对象的销毁 三、对象的处理 1、Redis是如何处理字符串对象的&#xff1f; 2、Redis是如何处理列表对象的&#xff1f…

使用Selenium与Scrapy处理动态加载网页内容的解决方法

博客正文&#xff08;包含详细注释&#xff09; 引言 在爬虫技术领域&#xff0c;处理动态加载的网页内容常常是一项挑战&#xff0c;尤其是对于那些通过用户滚动或其他交互动态加载更多内容的网站。本文将介绍如何结合使用Selenium和Scrapy来有效处理这类网页。 初探Seleni…

十九)Stable Diffusion使用教程:ai室内设计案例

今天我们聊聊如何通过SD进行室内设计装修。 方式一:controlnet的seg模型 基础起手式: 选择常用算法,抽卡: 抽到喜欢的图片之后,拖到controlnet里: 选择seg的ade20k预处理器,点击爆炸按钮,得到seg语义分割图,下载下来: 根据语义分割表里的颜色值,到PS里进行修改: 语…

制作一个简单 的maven plugin

流程 首先&#xff0c; 你需要创建一个Maven项目&#xff0c;推荐用idea 创建项目 会自动配置插件 pom.xml文件中添加以下配置&#xff1a; <project> <!-- 项目的基本信息 --> <groupId>com.example</groupId> <artifactId>my-maven-plugi…

封装调用的js方法

// 防止处理多次点击 function noMultipleClicks(methods, info) { // methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数 let that this; if (that.noClick) { // 第一次点击 that.noClick false; if (info &…

深入理解JVM设计的精髓与独特之处

这是Java代码的执行过程 从软件工程的视角去深入拆解&#xff0c;无疑极具吸引力&#xff1a;首个阶段仅依赖于源高级语言的细微之处&#xff0c;而第二阶段则仅仅专注于目标机器语言的特质。 不可否认&#xff0c;在这两个编译阶段之间的衔接&#xff08;具体指明中间处理步…