flatbuffer源码编译和使用方法
系统:ubuntu 22.04
flatbuffer版本:1.12.1
(免积分下载https://download.csdn.net/download/gz9456/90982223?spm=1001.2014.3001.5503)
flatbuffer特点和优势:
高性能,零拷贝,序列化后的数据体积小,序列化速度极快;
flatbuffer源码编译方法:
依赖:g++, cmake, make
1.将源码下载 解压flatbuffers-1.12.1。
2.在flatbuffers-1.12.1文件夹中创建build和install目录。
3.cd 到build目录,输入指令cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -DCMAKE_CXX_FLAGS="-Wno-class-memaccess" -DFLATBUFFERS_BUILD_SHAREDLIB=ON ..
指令解析:构建release版本,指定安装目录是相对当前目录的上一级目录里的install,构建动态库。 -DCMAKE_CXX_FLAGS="-Wno-class-memaccess"这句是防止编译报错:/arrays_test_generated.h:156:16: error: ‘void* memset(void*, int, size_t)’ clearing an object of non-trivial type ‘struct MyGame::Example::NestedStruct’; use assignment or value-initialization instead [-Werror=class-memaccess]
156 | std::memset(d_, 0, sizeof(d_));
| ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
4.make
5.make install
编译完成,install文件夹中生成对应的库、头文件和flatc.
flatc的使用方法:
flatc是flatbuffers的官方编译器,主要作用是将.fbs文件编译成指定语言的源代码,验证二进制文件是否与.fbs 匹配。 flatbuffer跟json相互转换。反序列化,将二进制转为可读的json。
详细用法:
1.编译.fbs为C++代码:
./flatc --cpp test.fbs 会生成头文件
2.将json转为flatbuffer二进制
flatc --binary test.fbs test.json 会生成test.bin
3.将flatbuffer二进制转为json
./flatc -t --raw-binary test.fbs -- test.bin
4.校验json是否符合.fbs格式,并生成二进制
./flatc --strict-json --binary test.fbs test.json
附:test.fbs和test.json内容
test.fbs
table Person {
id:int;
name:string;
}root_type Person;
test.json
{
id: 5,
name: "zhang"
}
flatbuffer在C++ 中的使用方法:
创建main.cpp,将install里面的flatbuffers文件夹拷贝过来。
#include <iostream>
#include <fstream>
#include <vector>
#include "test_generated.h" //此文件是用flatc生成的
int main() {
// 读取二进制文件到 buffer
std::ifstream infile("test.bin", std::ios::binary);
if (!infile) {
std::cerr << "Failed to open test.bin\n";
return 1;
}
std::vector<char> buffer((std::istreambuf_iterator<char>(infile)),
std::istreambuf_iterator<char>());
// 通过 generated 的函数读取数据
auto person = GetPerson(buffer.data());
std::cout << "ID: " << person->id() << "\n";
std::cout << "Name: " << person->name()->str() << "\n";
return 0;
}
编译g++ main.cpp -std=c++11 -I./
执行a.out,验证结果。
以上
原创,转载请注明出处。