Flatbuffers学习
flatbuffers简介
特点
- 无需解析/解包即可访问序列化数据;
- 强类型;
- 使用方便;
- 无依赖的跨平台代码;
与Protocol Buffers的比较(优点):
FlatBuffers schema
1 #include "FbBasicType.fbs"; // 消息头的类型,时间戳等等
2
3 namespace Jflat;
4
5 table FbFunction{
6 func_id : uint32;
7 param_list : [string]; // vector类型
8 return_value : string;
9 }
10
11 root_type FbFunction; // root_type声明序列化数据的object
FlatBuffers schema compilation
使用“flatc”编译.fbs文件,它将为对应编程语言创建生成代码。
1 flatc --gen-mutable --gen-object-api --reflect-names --cpp-ptr-type flatbuffers::unique_ptr --gen-compare --json --cpp --java --js --python *.fbs #--gen-all
2
3 --gen-mutable Generate accessors that can mutate buffers in-place.
4 --gen-object-api Generate an additional object-based API.
5 --reflect-names Add minimal type/name reflection.
6 --gen-compare Generate operator== for object-based API types.
FlatBuffers serialization methods
.h文件
1 #ifndef JFUNCTION_H
2 #define JFUNCTION_H
3
4 #include "JflatHeader.h"
5
6 class JFunction : public JflatHeader
7 {
8 public:
9
10 uint32_t func_id;
11 std::vector<std::string> param_list;
12 std::string return_value;
13
14 public:
15 JFunction();
16
17 explicit JFunction(const uint8_t *tmp_data);
18
19 explicit JFunction(uint32_t tmp_func_id, std::vector<std::string> &tmp_param_list, const std::string &tmp_return_value);
20
21 JFunction(const JFunction &tmp);
22
23 JFunction &operator=(const JFunction &tmp);
24
25 ~JFunction() = default;
26
27 std::string str();
28
29 const Jflat::FbMessage *getFbMessage(const uint8_t *data);
30
31 flatbuffers::Offset<Jflat::FbFunction> createFbFunction(flatbuffers::FlatBufferBuilder &builder) const;
32
33 flatbuffers::Offset<Jflat::FbMessage> createFbMessage(flatbuffers::FlatBufferBuilder &builder) const override;
34
35 std::shared_ptr<flatbuffers::DetachedBuffer> serializeAsFlat() const;
36
37 bool deserialize(const uint8_t *data) override;
38
39 bool getFbFunction(const Jflat::FbFunction *flat_function);
40
41 std::string serializeAsString() const;
42
43 private:
44 void assignmentVariable(const JFunction &tmp);
45 };
46
47 #endif //JFUNCTION_H
.cpp文件
1 #include "JFunction.h"
2
3 JFunction::JFunction() : func_id(0),
4 param_list(std::vector<std::string>()),
5 return_value("")
6 {
7 mObjType = Jflat::FbDataHeadType_FBT_RFC;
8 }
9
10 JFunction::JFunction(uint32_t tmp_func_id, std::vector<std::string> &tmp_param_list, const std::string &tmp_return_value)
11 : func_id(tmp_func_id),
12 param_list(tmp_param_list),
13 return_value(tmp_return_value)
14 {
15 mObjType = Jflat::FbDataHeadType_FBT_RFC;
16 }
17
18 JFunction::JFunction(const uint8_t *tmp_data)
19 {
20 mObjType = Jflat::FbDataHeadType_FBT_RFC;
21 deserialize(tmp_data);
22 }
23
24 JFunction::JFunction(const JFunction &tmp)
25 {
26 mObjType = Jflat::FbDataHeadType_FBT_RFC;
27 assignmentVariable(tmp);
28 }
29
30 JFunction &JFunction::operator=(const JFunction &tmp)
31 {
32 if (this != &tmp) assignmentVariable(tmp);
33 return *this;
34 }
35
36 void JFunction::assignmentVariable(const JFunction &tmp)
37 {
38 QObject::assignmentVariable(tmp.mStamp, tmp.mId, tmp.mObjType);
39
40 param_list.assign(tmp.param_list.begin(), tmp.param_list.end());
41 func_id = tmp.func_id;
42 return_value = tmp.return_value;
43 }
44
45 std::string JFunction::str()
46 {
47 return flatbuffers::FlatBufferToString(serializeAsFlat()->data(), Qflat::FbMessageTypeTable(), true);
48 }
49
50 std::string JFunction::serializeAsString() const
51 {
52 auto detached_buffer = serializeAsFlat();
53 if (detached_buffer)
54 return std::string((char *) detached_buffer->data(), detached_buffer->size());
55 else
56 return "";
57 }
58
59 std::shared_ptr<flatbuffers::DetachedBuffer> JFunction::serializeAsFlat() const
60 {
61 flatbuffers::FlatBufferBuilder builder;
62 auto flat = createFbMessage(builder);
63 builder.Finish(flat);
64
65 return std::make_shared<flatbuffers::DetachedBuffer>(builder.Release());
66 }
67
68 const Jflat::FbMessage *JFunction::getFbMessage(const uint8_t *data)
69 {
70 auto data_flat = Jflat::GetFbMessage(data);
71 obj_type = data_flat->header()->type();
72 stamp = data_flat->header()->stamp();
73 id = data_flat->header()->id();
74
75 return data_flat;
76 }
77
78 flatbuffers::Offset<Jflat::FbFunction> JFunction::createFbFunction(flatbuffers::FlatBufferBuilder &builder) const
79 {
80 auto flat_param_list = builder.CreateVectorOfStrings(param_list);
81 auto flat_return_value = builder.CreateString(return_value);
82 auto flat_function = Jflat::CreateFbFunction(builder, func_id, flat_param_list, flat_return_value);
83
84 return flat_function;
85 }
86
87 flatbuffers::Offset<Jflat::FbMessage> JFunction::createFbMessage(flatbuffers::FlatBufferBuilder &builder) const
88 {
89 auto header_function = Jflat::CreateFbMsgHeader(builder, Jflat::FbDataHeadType_FBT_RFC, mStamp, mId);
90 auto flat_function = createFbFunction(builder);
91 auto flat = Jflat::CreateFbMessage(builder, header_function, Jflat::FbMsgBody_FbFunction, flat_function.Union());
92
93 return flat;
94 }
95
96 bool JFunction::deserialize(const uint8_t *data)
97 {
98 auto data_flat = getFbMessage(data);
99 auto flat_function = data_flat->data_as_FbFunction();
100 getFbFunction(flat_function);
101
102 return true;
103 }
104
105 bool JFunction::getFbFunction(const Jflat::FbFunction *flat_function)
106 {
107 func_id = flat_function->func_id();
108
109 param_list.clear();
110 for (const auto &flat_data : *flat_function->param_list())
111 param_list.emplace_back(std::string(flat_data->data(), flat_data->size()));
112
113 return_value = std::string(flat_function->return_value()->data(), flat_function->return_value()->size());
114
115 return true;
116 }
FlatBuffers example
1 #include "JFunction.h"
2
3 #include <iostream>
4
5 #define FLAT_DATA_DIFF(before_data, after_data) \
6 { \
7 if(!(before_data == after_data)) \
8 { \
9 std::cout << #before_data << " : line" << __LINE__ << "========================== before =================================" << std::endl; \
10 std::cout << before_data << std::endl; \
11 std::cout << #after_data << " : line" << __LINE__ << "========================== after =================================" << std::endl; \
12 std::cout << after_data << std::endl; \
13 } \
14 }
15
16 void assignment_JFunction_instance(JFunction &jFunction_1)
17 {
18 jFunction_1.func_id = 222;
19
20 for (uint16_t i = 0; i < GENERIC_16_ARRAY_SIZE; ++i)
21 jFunction_1.param_list.push_back(std::to_string(i));
22
23 jFunction_1.return_value = "return_value pi pi sha"; /// 嘿嘿嘿,我女朋友
24 }
25
26 int main(void)
27 {
28 JFunction jFunction_1;
29 assignment_JFunction_instance(jFunction_1);
30 auto buf = jFunction_1.serializeAsFlat();
31
32 JFunction jFunction_2(buf->data());
33
34 FLAT_DATA_DIFF(jFunction_1.str(), jFunction_2.str());
35
36 return 0;
37 }
所有代码仅供参考,记录我当时的应用方法。
Flatbuffers学习的更多相关文章
- 值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...
- 值得学习的C/C++开源框架(转)
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- JAVA学习资源整理
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- C++的一些不错开源框架,可以学习和借鉴
from https://www.cnblogs.com/charlesblc/p/5703557.html [本文系外部转贴,原文地址:http://coolshell.info/c/c++/201 ...
- 【C/C++开发】值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
- 值得学习的C/C++开源项目 持续更新
值得学习的C语言开源项目 持续更新 文章目录 值得学习的C语言开源项目 持续更新 - 1. Webbench - 2. Tinyhttpd - 3. cJSON - 4. CMockery - 5. ...
- 金玉良缘易配而木石前盟难得|M1 Mac os(Apple Silicon)天生一对Python3开发环境搭建(集成深度学习框架Tensorflow/Pytorch)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_189 笔者投入M1的怀抱已经有一段时间了,俗话说得好,但闻新人笑,不见旧人哭,Intel mac早已被束之高阁,而M1 mac已经 ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
随机推荐
- 数据库连接Database link?
在一个用户下,可以获取到另外的用户下的表的数据,通常在跨数据库时使用. create database link link93 connect to scott identified by tiger ...
- 什么是bean装配?
装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起.
- 面试问题之操作系统:Linux下进程的内存结构
转载于:http://www.hqj.com/news/emb184.htm Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间.该地址空间是大小为4GB的线性虚拟空间 ...
- java程序如何确保多线程的运行安全?
线程的安全问题体现在: 原子性:一个或多个操作在CPU执行过程中不被中断的特性 可见性:一个线程对共享变量的修改,另一个线程能立刻看到 有序性:程序执行的顺序按照代码的先后顺序执行 导致线程存在安全问 ...
- 集合流之"交集(相同)和差集(区别的)"的使用
一.需求 今天做的是将两个字符串转为数组后再转集合,然后利用集合的流stream来进行差集过滤 二.差集代码 差集:将两个集合相同的数据去掉,留下不同的数据 1 @Test 2 public void ...
- 小技巧之“将Text文件中的数据导入到Excel中,这里空格为分割符为例”
1.使用场景 将数据以文本导出后,想录入到Excel中,的简便方案, 起因:对于Excel的导出,Text导出明显会更方便些 2.将Text文件中的数据导入到Excel中,这里空格为分割符为例的步骤 ...
- C语言之API
C语言之API 1.输入(控制台输入) scanf("%d,%d",&a,&b); 2.输出(打印数值) printf("max=%d\n",c ...
- java中如何获得src路径
代码 解析: 类名.class.get类加载器().getResourceAsStream("文件名"); 案例代码: Demo.class.getClassLoader().ge ...
- 线性二次型控制器(LQR)——轨迹跟踪器
1 概念 2 线性时变系统的跟踪问题 3 线性定常系统的跟踪问题 公式18--22为求解的关键 根据20.21分别求出P.g的值则通过18可求得期望的输出u 4 实例分析 5 仿真实验 先将上 ...
- Altium design16设计技巧
第一栏:共有界面 1.在原理图和PCB都打开的情况下,选中原理图可以对应到PCB界面元件里面 第二栏:原理图界面 1.批量改变元件属性 选择某一元件-查找相似对象-将其要改变的内容设置为same-点击 ...