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 ...
随机推荐
- 关于《数据格式修改》的简单应用程序(C语言)
关于<数据格式修改>的简单应用程序(C语言) 至亲爱的博友: 大家好,好久不见了.由于博主还是一名大学在校生,不可避免的需要和指导教师共同完成一些项目,因此前一段时间暂时停止了博客的更新. ...
- 快速排序Java版
package Quick; public class quicksort { static class QuickSort { public int data[]; private int part ...
- 解决浏览器兼容问题的css hack
原理 由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系.我们就可以根据这个来针对不同的浏览器来写不同的CSS.CSS Hack大致有3种表现形式,CSS类内部Hack.选择 ...
- Java垃圾回收机制的工作原理
Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 获取更多内容,请关注小编个人微信公众平台: 一.Java中引入垃圾回收机制的作用 ...
- 教你成为全栈工程师(Full Stack Developer) 一-各显神通总结八大类编程语言的区别
为了能在最快的时间里理解更多语言的相同点和不同点,我用大家最熟悉的Hello World来展示一下各个语言的奥妙 请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址 ...
- 网页视频下载牛逼工具,支持各种格式转换,比如腾讯视频格式qlv转mp4
这种思路真是创新,原文地址:http://jingyan.baidu.com/article/5225f26b03f047e6fb090860.html 软件工具名字:维棠下载. 上图: 1:搜索视频 ...
- LR回放和录制设置
1.回放迭代设置:run-time settings 日志:扩展的-参数替换(常用).服务器返回数据.高级 2.回放时视图显示设置 设置 效果
- 用websocket实现后台推送消息
1前台实现 connect:function() { var webSocketIP = window.CRM_CONFIG.WebSocketIP; var target = 'ws://'+web ...
- Tomcat启动时报错:java.net.UnknownHostException
异常信息如下: INFO: Failed to get local InetAddress for VMID. This is unlikely to matter. At all. We'll ad ...
- 使用visualvm 远程监控 JVM
1. 测试环境 Ubuntu Server 10.01 2. 在服务器上安装 jstatd 组件 使用apt-get 命令安装 openjdk 即可 : sudo apt-get install o ...