复制
收藏
提问
全网
flatbuffer 定义fbs
4月前
理解问题flatbuffer 定义fbs
已完成理解「flatbuffer 定义fbs」
展开阅读网页
FlatBuffers 是一种高效的二进制序列化库,它允许你定义一个 schema(定义文件),通常以 .fbs
为扩展名,来描述你想要序列化的数据结构。这个 schema 文件定义了数据的类型和结构,然后 FlatBuffers 编译器会根据这个 schema 生成代码,用于序列化和反序列化数据。
基本定义
在 .fbs
文件中,你可以定义多种数据类型,包括标量类型(如 int, float 等)、复合类型(如 structs 和 tables)以及枚举(enums)和联合(unions)。以下是一些基本定义的示例:
-
标量类型:包括 8 位、16 位、32 位和 64 位的整数和浮点数,以及布尔类型。例如:
byte: 8 bit signed integer ubyte: 8 bit unsigned integer bool: boolean short: 16 bit signed integer ushort: 16 bit unsigned integer int: 32 bit signed integer uint: 32 bit unsigned integer float: 32 bit floating point number long: 64 bit signed integer ulong: 64 bit unsigned integer double: 64 bit floating point number ```<a data-index="0" class='citation' href="#citation-1" target="_blank">1</a>
-
Structs:类似于 C 语言中的结构体,字段不能是可选的,且一旦定义不能更改。Structs 通常用于表示不会更改的数据结构,因为它们在内存中占用更少,检索速度更快。1
-
Tables:与 Structs 类似,但字段可以是可选的,并且可以添加或废弃字段。Tables 允许更多的灵活性,但相比 Structs 会占用更多的内存和有稍微慢的检索速度。1
-
Enums:用于定义一组命名的常量。1
-
Unions:允许一个字段可以是多种类型中的一种。1
定义示例
以下是一个简单的 .fbs
文件示例,展示了如何定义一个包含多种数据类型的 table:
// 定义一个枚举类型
enum Color:byte { Red = 1, Green, Blue }
// 定义一个结构体
struct Vec3 {
x:float;
y:float;
z:float;
}
// 定义一个 table,包含一个 int 类型的字段,一个字符串字段,一个枚举字段和一个结构体字段
table Monster {
id:int;
name:string;
color:Color;
position:Vec3;
}
使用 FlatBuffers
- 定义 schema:首先,你需要编写一个
.fbs
文件来定义你的数据结构。 - 生成代码:使用 FlatBuffers 编译器
flatc
根据 schema 生成代码。例如,使用命令flatc --cpp monster.fbs
会生成 C++ 代码。 - 序列化和反序列化:使用生成的代码来序列化你的数据结构到一个 binary buffer,或者从 binary buffer 中反序列化数据。
FlatBuffers 的设计目标是高效和跨平台,它通过减少内存复制和解析时间来优化性能。此外,由于 schema 的存在,它还提供了向前和向后的兼容性,使得在不破坏旧代码的情况下可以扩展数据结构。72
更专业一些
转笔记
专业
flatbuffer 定义fbs不在提醒