FlatBuffers入门
1、下载flatbuffers
从https://github.com/google/flatbuffers地址下载flatbuffers-master.zip文件。
2、编译flatbuffers
解压flatbuffers-master.zip文件文件,使用VS2010打开flatbuffers-master\build\VS2010\FlatBuffers.sln文件进行编译。编译后生成的文件如下:
1. flatc.exe - 编译schema文件、生成代码
2. flatsamplebinary.exe - 测试程序,将二进制转换为C++对象
3. flatsampletext.exe - 测试程序,将json转换为C++对象
4. flattests.exe - 测试flatbuffers
3、json与C++对象相互转换
flatbuffers的测试程序中有json与c++对象相互转换的例子,但是不够方便,在这里我们可以封装一下。
FlatBufferJsonFactory.h
#include "TypeBind.h" // 详见我的另一篇博文"C++模板之类型与数据绑定"
class FlatBufferJsonFactory {
private:
struct ParserInfo {
ParserInfo(const std::string& _path)
: path(_path), parser(nullptr)
{}
std::string path; // fbs文件路径
flatbuffers::Parser* parser; // flatbuffers解析器
};
public:
// 将json字符串转换为了对象缓冲区
template<class T>
std::string parserJson(const std::string& s) {
const ParserInfo& info = getParser<T>();
info.parser->Parse(s.c_str(), nullptr);
const size_t size = info.parser->builder_.GetSize();
const char* ptr = (const char*)info.parser->builder_.GetBufferPointer();
std::string buffer(ptr, ptr + size);
return buffer;
}
// 将对象缓存转换为json字符串
template<class T>
std::string toJson(const void* buffer) {
std::string json;
const ParserInfo& info = getParser<T>();
flatbuffers::GeneratorOptions options;
options.strict_json = true;
GenerateText(*info.parser, buffer, options, &json);
return json;
}
// 注册
template<class T>
void Register(const std::string& path) {
ParserInfo info(path);
m_map.bind<T>(info);
}
template<class T>
const ParserInfo& getParser() {
ParserInfo& info = m_map.find<T>();
if (!info.parser) {
std::string buf;
flatbuffers::LoadFile(info.path.c_str(), false, &buf);
flatbuffers::Parser* parser = new flatbuffers::Parser();
bool ret = parser->Parse(buf.c_str(), nullptr);
info.parser = parser;
}
return info;
}
static FlatBufferJsonFactory& Instance() {
static FlatBufferJsonFactory* instance = nullptr;
if (!instance)
instance = new FlatBufferJsonFactory();
return *instance;
}
private:
FlatBufferJsonFactory() {}
TypeBind<ParserInfo> m_map;
};
编写test.fbs文件
namespace TestApp;
struct KV {
key: ulong;
value: double;
}
table TestObj {
id: ulong;
name: string;
flag: ubyte = ;
list: [ulong];
kv: KV;
}
root_type TestObj;
然后利用"flatc.exe"生成.h文件,并使用此.h文件
int _tmain(int argc, _TCHAR* argv[])
{
FlatBufferBuilder fbb; // 设置数据
std::vector<uint64_t> v = { , , , , };
auto kv = KV(, 1.0);
auto name = fbb.CreateString("");
auto vec = fbb.CreateVector(v); TestObjBuilder builder(fbb);
builder.add_id();
builder.add_name(name);
builder.add_flag();
builder.add_list(vec);
builder.add_kv(&kv);
fbb.Finish(builder.Finish()); // 注册
FlatBufferJsonFactory::Instance().Register<TestApp::TestObj>("E:\\c++\\use_flat_buffers\\use_flat_buffers\\test.fbs"); std::string json = FlatBufferJsonFactory::Instance().toJson<TestApp::TestObj>(fbb.GetBufferPointer());
std::string buffer = FlatBufferJsonFactory::Instance().parserJson<TestApp::TestObj>(json); const TestApp::TestObj* obj = GetTestObj(buffer.c_str());
const char* names = obj->name()->c_str(); return ;
}
FlatBuffers入门的更多相关文章
- FlatBuffer入门笔记
FlatBuffer入门笔记 1 flatbuffer资料 flatbuffer下载地址:https://github.com/google/flatbuffers flatbuffer官方使用文档: ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
随机推荐
- Java 在本地文件中查找固定字符串
适用范围:只适用于在文本文档中查找(如,txt.java.c等等,并不适用与doc.xls等等这些文件),可嵌套文件夹.但是对中文不支持. 例如:文件夹:F:/demo 子文件夹:F:/demo/er ...
- Css3新特性应用之过渡与动画
目录 背景与边框第一部分 背景与边框第二部分 形状 视觉效果 字体排印 用户体验 结构与布局 过渡与动画 源码下载 一.缓动效果 学习和利用贝塞尔曲线,默认支持ease,ease-in,ease-ou ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)介绍
NSGA(非支配排序遗传算法).NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化. 在官网: http://www.ii ...
- C#Redis列表List
一.前戏 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis将 ...
- JS返回HTML 传递参数
var html="<a title=\"Remove\" style='cursor:pointer' cdata='" + id + "' ...
- python中的编码声明
python中的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python 相当于写死了 python 路径(是告诉OS执行这个py时,调 ...
- [SQL基础教程] 4-1 数据的插入(INSERT)
[SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...
- 如何将MongoDB数据库的数据迁移到MySQL数据库中
FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...
- C#:继承多态的方法实现数的简单加减乘除运算
// 定义一个抽象的父类 abstract class Figure { //声明抽象方法: //父类中的所有家里人可以用的方法必须都应用到子类中 ...
- chap3 数组 #C
4.1 数组的基本概念 4.1.1 要点归纳 一维数组 定义: int a[10]; 数组名是一个地址常量,不允许修改. 引用: 初始化: 静态数组 static int a[10];的初值? 全部赋 ...