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的长度如果小于实际的长度会报异常。
【参考】