FlatBuffers官方版是一款非常专业且优秀的跨平台序列化库,可以帮助用户对自己的数据进行序列化处理,可以直接访问序列化的数据,免去了对应用程序进行解析和解包的操作,允许用户直接访问序列化数据,不必事先进行解包,而且能够高效存储,适用于多种不同的编程语言,包括C++,C#,C,Java,Python,PHP等,FlatBuffers是一个二进制缓冲区,与大多数内存数据结构不同,FlatBuffers使用严格的对齐和字节顺序规则来确保这些缓冲区是跨平台的,您可以在模式中定义对象类型,也可以将其编译为C++或Java以实现低至零的读写开销,FlatBuffers应用范围非常广,可使用它来序列化游戏数据,也可将其用于客户端与服务器之间的通信,需要的话就来小兔网下载吧!
FlatBuffers软件介绍
FlatBuffers是一个开源的、跨平台的序列化库,旨在实现最大的内存效率。FlatBuffers最初是在谷歌为游戏开发和其他对性能要求很高的应用程序创建的,它的独特之处在于允许你直接访问序列化的数据,而不必事先进行解析或解包。由于访问你的数据所需的唯一内存是缓冲区的内存,所以它也是非常高效和快速的内存。
FlatBuffers支持Windows、MacOS、Linux和Android,以及其他任何带有最新C++编译器的操作系统。它支持大量的编程语言,包括C++、C#、C、Go、Java、Kotlin、JavaScript、Lobster、Lua、TypeScript、PHP和许多其他正在进行的语言。
FlatBuffers软件功能
编写一个架构文件,该文件可让您定义可能要序列化的数据结构
使用flatc(FlatBuffer编译器)生成带有帮助程序类的C ++头文件(或Java / Kotlin / C#/ Go / Python ..类),以访问和构造序列化数据。
使用FlatBufferBuilder该类构造一个平面二进制缓冲区。生成的函数使您可以递归地将对象添加到此缓冲区中,通常就像进行单个函数调用一样简单。
回读时,您可以从二进制缓冲区中获取指向根对象的指针
可将缓冲区存储或发送到某个地方
对于表对象,FlatBuffers分享了向前/向后兼容性以及字段的一般可选性,以支持大多数形式的格式演变。
FlatBuffers还分享“裸”结构,该结构不分享向前/向后兼容性,但可以更小(对于不太可能更改的非常小的对象(例如坐标对或RGBA颜色)很有用)。
可以将有关格式的大多数信息纳入生成的代码中,从而减少存储数据所需的内存以及访问数据的时间。
FlatBuffers软件特色
不需要解析/解包就可以访问序列化数据 ---- FlatBuffers的不同之处在于,它在一个平面二进制缓冲区中表示分层数据,这样就可以直接访问它,而不需要解析/解包,同时仍然支持数据结构的演化(向前/向后兼容)。
内存效率和速度 ---- 访问数据时唯一内存需求就是缓冲区,不需要额外的内存分配。
扩展性、灵活性 ----- 它支持的可选字段意味着不仅能获得很好的前向/后向兼容性。
最小代码依赖 ----- 仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。
强类型设计 ---- 尽可能使错误出现在编译期。而不是等到运行期才手动检查和修正。
使用简单------ 生成的C++代码分享了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本。
跨平台 ----- 支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好。
FlatBuffers官方教程
编写FlatBuffer模式
要开始使用FlatBuffers,首先需要创建一个schema文件,该文件定义要序列化的每个数据结构的格式。这是schema为知识兔的定义模板的模板:
如您所见,schema 接口定义语言(IDL)的语法与C系列语言和其他IDL语言的语法相似。让知识兔检查其中的每个部分schema以确定其作用。
该schema带开始namespace申报。这将为生成的代码确定相应的包/名称空间。在知识兔的示例中,知识兔在Sample名称空间内部具有MyGame名称空间。
接下来,知识兔有一个enum定义。在此示例中,知识兔有一个enum类型为byte,名为Color。知识兔在这三个值enum:Red,Green,和Blue。知识兔指定Red = 0和Blue = 2,但未指定的显式值Green。由于an的行为enum是在未指定的情况下递增,因此Green将收到的隐式值1。
紧随其后的enum是一个union。在union这个例子不是非常有用,因为它仅包含一个table(命名Weapon)。如果知识兔创建了多个表,希望union它们能够被引用,则可以向中添加更多元素union Equipment。
之后union是struct Vec3,它表示具有3尺寸的浮点向量。知识兔使用了struct这里,过了table,因为structs为理想的,不会改变,因为它们使用更少的内存,并具有更快的查找数据结构。
该Monster表是FlatBuffer中的主要对象。这将用作存储知识兔的orc怪物的模板。知识兔为字段指定了一些默认值,例如mana:short = 150。如果未指定,则标量字段(如int,uint或float)将默认设置为,0而字符串和表格将默认设置为null。需要注意的另一件事是线路friendly:bool = false (deprecated);。由于您不能从中删除字段table(以支持向后兼容性),因此可以将字段设置为deprecated,这将防止在生成的代码中为此字段生成访问器。deprecated但是,使用时要小心,因为它可能会破坏使用此访问器的旧代码。
该Weapon表是在FlatBuffer中使用的子表。它被使用两次:一次在Monster表中,一次在Equipment联合中。对于知识兔来说Monster,它用于在知识兔vector of tables的weapons字段中填充一个via字段Monster。它也是Equipment工会引用的唯一表。
的最后一部分schema是root_type。根类型声明将是序列化数据的根表。在知识兔的例子中,根类型是知识兔的Monster表。
标量类型还可以使用别名类型名称,例如int16代替short和float32代替float。因此,知识兔也可以将该Weapon表编写为:
编译怪物的模式
编写FlatBuffers模式后,下一步就是对其进行编译。
如果您尚未这样做,请按照以下说明来构建flatcFlatBuffer编译器。
一旦flatc构建成功,请为您的语言编译架构:
读写Monster FlatBuffers
现在,知识兔已经为编程语言编译了架构,知识兔可以开始创建一些怪物,然后从FlatBuffers对其进行序列化/反序列化。
创建和编写Orc FlatBuffers
第一步是导入/包括库,生成的文件等。
现在知识兔准备开始构建一些缓冲区。为了开始,知识兔需要创建一个实例,该实例FlatBufferBuilder将包含缓冲区的增长。您可以传递缓冲区的初始大小(此处为1024字节),如果需要,该大小将自动增长:
创建完之后builder,知识兔就可以开始序列化数据了。在制作orc怪物之前,让知识兔创建一些Weapon:aSword和an Axe。
现在,让知识兔创建知识兔的怪物orc。为此orc,让他red发怒,定位于(1.0, 2.0, 3.0),并给他大量的生命值300。知识兔可以给他一个向量的武器(知识兔Sword和Axe以前)。在这种情况下,知识兔将为他配备Axe,因为它是两者中功能最强大的。最后,让知识兔用一些潜在的宝藏来填补他的库存,一旦他被击败,这些宝藏就可以被拿走。
在序列化怪物之前,知识兔需要首先序列化包含在其中的所有对象,即,知识兔使用深度优先的预遍历序列化数据树。通常在任何树形结构上都很容易做到这一点。
知识兔序列化了两个内置数据类型(string和vector),并捕获了它们的返回值。这些值是序列化数据中的偏移量,指示它们的存储位置,以便在向怪物添加字段时可以在下面引用它们。
注意:要创建一个vector嵌套对象(例如tables,strings或other vector),请将其偏移量收集到一个临时数据结构中,然后创建一个vector包含其偏移量的附加对象。
如果不是从一个现有的数组创建向量,而是逐个序列化元素,请注意,这是相反的顺序,因为缓冲区是从头开始构建的。
例如,看一下Weapon知识兔先前创建的两个(Sword和Axe)。它们都是FlatBuffer table,它们的偏移量现在存储在内存中。因此,知识兔可以创建一个FlatBuffervector来包含这些偏移量。
请注意,还有其他的便利重载CreateVector,它允许您处理不在a中的数据,std::vector或者允许您通过调用lambda来生成元素。对于的常见情况,std::vector也有CreateVectorOfStrings。
请注意,结构的向量与表的序列化方式不同,因为结构以内联方式存储在向量中。例如,为path上面的字段创建一个向量:
现在知识兔已经序列化了兽人的非标量组件,因此知识兔可以序列化怪物本身:
如果您不想在a中设置每个字段table,则可以更方便地手动设置怪物的每个字段,而不是调用CreateMonster()。以下代码段在功能上等同于上面的代码,但分享了更多的灵活性。
在完成序列化之前,让知识兔快速看一下FlatBuffer union Equipped。每个FlatBuffer都有两部分union。第一个_type是生成的隐藏字段,用于保存所table引用的类型union。这使您可以在运行时知道要转换为哪种类型。其次是union的数据。
在知识兔的示例中,知识兔添加到的最后两件事Monster是Equipped Type和Equipped本身。
这是这些行的重复,以帮助更清楚地突出显示它们:
创建缓冲区后,orc变量中的数据根将具有偏移量,因此可以通过调用适当的finish方法来完成缓冲区。
现在可以准备将缓冲区存储在某个位置,通过网络发送,进行压缩或进行任何其他操作。您可以这样访问缓冲区:
FlatBuffers更新日志
1、优化了用户使用界面
2、修复了某些已知bug
下载仅供下载体验和测试学习,不得商用和正当使用。
下载体验