FlatBuffer入门笔记

1 flatbuffer资料

flatbuffer下载地址:https://github.com/google/flatbuffers

flatbuffer官方使用文档:https://google.github.io/flatbuffers/index.html#flatbuffers_overview

flatbuffer官方测试用例:https://google.github.io/flatbuffers/flatbuffers_guide_use_cpp.html

2 编写IDL|Schema

2.1 IDL测试文件

  引用官方测试使用的IDL

  1. // Example IDL file for our monster's schema.
  2. namespace MyGame.Sample;
  3. enum Color:byte { Red = , Green, Blue = }
  4. union Equipment { Weapon } // Optionally add more tables.
  5. struct Vec3 {
  6. x:float;
  7. y:float;
  8. z:float;
  9. }
  10. table Monster {
  11. pos:Vec3; // Struct.
  12. mana:short = ;
  13. hp:short = ;
  14. name:string;
  15. friendly:bool = false (deprecated);
  16. inventory:[ubyte]; // Vector of scalars.
  17. color:Color = Blue; // Enum.
  18. weapons:[Weapon]; // Vector of tables.
  19. equipped:Equipment; // Union.
  20. path:[Vec3]; // Vector of structs.
  21. }
  22. table Weapon {
  23. name:string;
  24. damage:short;
  25. }
  26. root_type Monster;

2.2  生成桩文件

  利用flatc.exe生成IDL对应的桩代码,命令格式为

  1. flatc [ GENERATOR OPTIONS ] [ -o PATH ] [ -I PATH ] [ -S ] FILES... [ -- FILES...]
  1. flatc --cpp monster.fbs

  flatbuffer使用模板编程,仅生成h文件。对应的文件名为filename_generated.h。这里生成monster_generated.h文件。

2.3 IDL数据类型

2.3.1 Table

  Table是FlatBuffer定义的主要数据类型,一个Table包含一个名称(如2.1的Monster),以及一组字段(如2.1的Monster)。每个字段由名称、类型及默认值组成。

  FlatBuffer每个字段都是可选的,这由FlatBUffer的线性实现机制决定:空闲字段仅填充默认占位值,而不占用分配size。

2.3.2 Struct

  Struct只包含数值类型与其他struct,与Table相比,Struct使用更少的存储空间以及更快的访问速度。

2.3.3 Type

  内建的数值类型有:

  • 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)

  内建的非数值类型有:

  • vector,用[]表示
  • string
  • 指向其他Table、struct、enum、unions的引用

2.3.4 Enums

  定义了一系列的命名常量,可以给定默认值。第一个变量的默认值为0。

2.3.5 Namespaces

  可以定义嵌套的namespace,用.分割。

2.3.6 Root type

  定义序列化的root table或者struct。

3 序列化与反序列化

  对2.1例子的序列化和反序列化过程实现在sample_binary.cpp。

3.1 序列化

  1. // Build up a serialized buffer algorithmically:
  2. flatbuffers::FlatBufferBuilder builder; //申请一个flatbuffer
  3.  
  4. // First, lets serialize some weapons for the Monster: A 'sword' and an 'axe'.
  5. auto weapon_one_name = builder.CreateString("Sword"); //在buffer中申请string
  6. short weapon_one_damage = ;
  7.  
  8. auto weapon_two_name = builder.CreateString("Axe"); //在buffer中申请string
  9. short weapon_two_damage = ;
  10.  
  11. // Use the `CreateWeapon` shortcut to create Weapons with all fields set.
  12. auto sword = CreateWeapon(builder, weapon_one_name, weapon_one_damage); //桩代码中实现
  13. auto axe = CreateWeapon(builder, weapon_two_name, weapon_two_damage); //
  14.  
  15. // Create a FlatBuffer's `vector` from the `std::vector`.
  16. std::vector<flatbuffers::Offset<Weapon>> weapons_vector;
  17. weapons_vector.push_back(sword);
  18. weapons_vector.push_back(axe);
  19. auto weapons = builder.CreateVector(weapons_vector); //在buffer中序列化vector
  20.  
  21. // Second, serialize the rest of the objects needed by the Monster.
  22. auto position = Vec3(1.0f, 2.0f, 3.0f);
  23.  
  24. auto name = builder.CreateString("MyMonster");
  25.  
  26. unsigned char inv_data[] = { , , , , , , , , , };
  27. auto inventory = builder.CreateVector(inv_data, );
  28.  
  29. // Shortcut for creating monster with all fields set:
  30. auto orc = CreateMonster(builder, &position, , , name, inventory,
  31. Color_Red, weapons, Equipment_Weapon, axe.Union());
  32.  
  33. builder.Finish(orc); // Serialize the root of the object. //序列化对象root
  34.  
  35. // We now have a FlatBuffer we can store on disk or send over a network.
  36.  
  37. // ** file/network code goes here :) **

3.2 反序列化

  1. // access builder.GetBufferPointer() for builder.GetSize() bytes
  2.  
  3. // Instead, we're going to access it right away (as if we just received it).
  4.  
  5. // Get access to the root:
  6. auto monster = GetMonster(builder.GetBufferPointer()); //获取根对象指针
  7.  
  8. // Get and test some scalar types from the FlatBuffer.
  9. assert(monster->hp() == );
  10. assert(monster->mana() == ); // default
  11. assert(monster->name()->str() == "MyMonster");
  12.  
  13. // Get and test a field of the FlatBuffer's `struct`.
  14. auto pos = monster->pos();
  15. assert(pos);
  16. assert(pos->z() == 3.0f);
  17. (void)pos;
  18.  
  19. // Get a test an element from the `inventory` FlatBuffer's `vector`.
  20. auto inv = monster->inventory();
  21. assert(inv);
  22. assert(inv->Get() == );
  23. (void)inv;
  24.  
  25. // Get and test the `weapons` FlatBuffers's `vector`.
  26. std::string expected_weapon_names[] = { "Sword", "Axe" };
  27. short expected_weapon_damages[] = { , };
  28. auto weps = monster->weapons();
  29. for (unsigned int i = ; i < weps->size(); i++) {
  30. assert(weps->Get(i)->name()->str() == expected_weapon_names[i]);
  31. assert(weps->Get(i)->damage() == expected_weapon_damages[i]);
  32. }
  33. (void)expected_weapon_names;
  34. (void)expected_weapon_damages;
  35.  
  36. // Get and test the `Equipment` union (`equipped` field).
  37. assert(monster->equipped_type() == Equipment_Weapon);
  38. auto equipped = static_cast<const Weapon *>(monster->equipped());
  39. assert(equipped->name()->str() == "Axe");
  40. assert(equipped->damage() == );
  41. (void)equipped;

4 FlatBuffer原理?网上找的一些文档

  https://www.jianshu.com/p/fa999434776a

FlatBuffer入门笔记的更多相关文章

  1. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  2. ES6入门笔记

    ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...

  3. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  4. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  5. redis入门笔记(2)

    redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...

  6. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

  7. OpenGLES入门笔记四

    原文参考地址:http://www.cnblogs.com/zilongshanren/archive/2011/08/08/2131019.html 一.编译Vertex Shaders和Fragm ...

  8. OpenGLES入门笔记三

    在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...

  9. unity入门笔记

    我于2010年4月1日硕士毕业加入完美时空, 至今5年整.刚刚从一家公司的微端(就是端游技术+页游思想, 具体点就是c++开发, directX渲染, 资源采取所需才会下载)项目的前端主程职位离职, ...

随机推荐

  1. python 通过文件路径获取文件hash值

    import hashlib import os,sys def CalcSha1(filepath): with open(filepath,'rb') as f: sha1obj = hashli ...

  2. return的结果

    return只会返回第一个,接下去的不会再返回 所以return放在for里面用的话,即使循环好几次,但是除了循环的第一个,后面循环出来的结果都作废

  3. linux qt下 QSqlDatabase: QMYSQL driver not loaded

    出现上述问题是qt安装目录未包含mysql驱动. 解决方法如下: 1.查看系统是否存在libqsqlmysql.so find / -name libqsqlmysql.so 2.若不存在该文件则安装 ...

  4. windows平台tensorboard的配置及使用

    由于官网和其他教程里面都是以Linux为平台演示tensorboard使用的,而在Windows上与Linux上会有一些差别,因此我将学习的过程记录下来与大家分享(基于tensorflow1.2.1版 ...

  5. SCADA 必备函数之 :关于消息的函数

    Message Functions BroadcastSystemMessage//是将一条系统消息广播给系统中所有的顶级窗口. BroadcastSystemMessageEx//将消息发送到指定的 ...

  6. (二)无状态的web应用(单py的Django占位图片服务器)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 阅读本文建议了解Django框架的基本工作流程,了解WSGI应用,如果对以上不是很清楚,建议结 ...

  7. beego——日志处理

    这是一个用来处理日志的库,它的设计思路来自于 database/sql,目前支持的引擎有 file.console.net.smtp,可以通过如下方式进行安装: go get github.com/a ...

  8. mysql数据库从删库到跑路之mysql表操作

    表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 内容: 1 创建表 ...

  9. 转载 C#开发串口总结,并提炼串口辅助类到公用类库中

    C#开发串口总结,并提炼串口辅助类到公用类库中 开发C#相关的项目有很多年了,一直没有接触串口的开发,近期由于工作的需要,需要了解熟悉对硬件串口的开发,通过对串口的深入了解,串口也不再是什么神秘的东西 ...

  10. javascript与jQuery的each,map回调函数参数顺序问题

    <script> var arr = [2,3,6,7,9]; //javascript中的forEach 和 map方法 arr.forEach(function(value,index ...