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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值