当前位置: 首页 > news >正文

flatbuffer的数组小例子(C++)

1.官网

https://github.com/google/flatbuffers

编译就不用说了,往上资料很多,尤其在Linux环境下。下面注意说一下windows下怎么编译头文件,以及怎么使用。

2.下载flatc.exe

https://github.com/google/flatbuffers/releases

 注意:自己编译麻烦,还不一定能成功

3.编写.fbs文件(下面是以“城市”为例子,主要测试以下数组类型的用法)

namespace Location;
table City_Fb
{
	city_name :string;
	area_code :string;
}
table Provice_Fb
{
	city_list:[City_Fb];
}
root_type Provice_Fb;

 文件命名为:city.fbs

4.生成.h文件

flatc -c -o ./ ./city.fbs

5.VS新建工程

把生成的头文件引入进来,另外,要引入flatbuffer源码的include文件夹下的头文件(要不然找不到flatbuffer.h)

 6.编写代码测试

// flatc.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include "city_generated.h"
#include <iostream>

int main()
{
	flatbuffers::FlatBufferBuilder build_data;

	// 序列化
	std::vector<flatbuffers::Offset<Location::City_Fb>> cityVector;
	auto city1 = Location::CreateCity_Fb(build_data, build_data.CreateString("邯郸"), build_data.CreateString("0310"));
	auto city2 = Location::CreateCity_Fb(build_data, build_data.CreateString("石家庄"), build_data.CreateString("0311"));
	auto city3 = Location::CreateCity_Fb(build_data, build_data.CreateString("保定市"), build_data.CreateString("0312"));
	auto city4 = Location::CreateCity_Fb(build_data, build_data.CreateString("张家口"), build_data.CreateString("0313"));
	cityVector.push_back(city1);
	cityVector.push_back(city2);
	cityVector.push_back(city3);
	cityVector.push_back(city4);

	auto citys = build_data.CreateVector(cityVector);
	auto provice = Location::CreateProvice_Fb(build_data, citys);
	build_data.Finish(provice);
	
	//保存起来
	char buffer[1024] = {0};
	memcpy(buffer, build_data.GetBufferPointer(), build_data.GetSize());
	
	//反序列化
	flatbuffers::FlatBufferBuilder builder_out;
	builder_out.PushBytes((const uint8_t*)buffer, 1024);
	auto city_out = Location::GetProvice_Fb(builder_out.GetCurrentBufferPointer());
	for (auto i = 0; i < city_out->city_list()->Length(); ++i)
	{
		std::string city_name = city_out->city_list()->Get(i)->city_name()->str();
		std::string area_code = city_out->city_list()->Get(i)->area_code()->str();
		std::cout << "city_name " << i << ":" + city_name << ",area_code " << i << ":" + area_code << std::endl;
	}
	getchar();
}

这里保存到buffer里(buffer的数据可以进行网络传输,也可以保存文件,这里就不再演示),开了1024byte空间,肯定比使用的要大。在解析的时候PushBytes的长度如果小于实际的长度会报异常。

 【参考】

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

相关文章:

  • GEOS库使用
  • valgrind的使用
  • git拉取分支
  • linux查看进程启动及运行时间
  • 进程空间分配和堆栈大小
  • git submodule用法
  • spark入门知识点
  • scala简介
  • vim辅助工具
  • thrift使用的一个坑
  • 正则表达式-实用的过滤
  • git在分支的基础上建分支
  • git submodule的用法
  • C++ MD5计算
  • python 输出中文问题
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • angular2 简述
  • Apache Zeppelin在Apache Trafodion上的可视化
  • canvas 高仿 Apple Watch 表盘
  • CODING 缺陷管理功能正式开始公测
  • Debian下无root权限使用Python访问Oracle
  • input的行数自动增减
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascripit类型转换比较那点事儿,双等号(==)
  • k8s 面向应用开发者的基础命令
  • leetcode386. Lexicographical Numbers
  • Linux Process Manage
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • vue-loader 源码解析系列之 selector
  • Webpack 4 学习01(基础配置)
  • 编写符合Python风格的对象
  • 第2章 网络文档
  • 高度不固定时垂直居中
  • 讲清楚之javascript作用域
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 【云吞铺子】性能抖动剖析(二)
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (arch)linux 转换文件编码格式
  • (Python) SOAP Web Service (HTTP POST)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第27天)Oracle 数据泵转换分区表
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (四)c52学习之旅-流水LED灯
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)关于多人操作数据的处理策略
  • ./configure,make,make install的作用(转)
  • .cn根服务器被攻击之后
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET 的静态构造函数是否线程安全?答案是肯定的!