文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

还在用Protocol Buffers?快来看看FlatBuffers!

2024-11-29 22:10

关注

什么是 FlatBuffers?

FlatBuffers 是一个高效的、跨平台的序列化库,特别适用于游戏开发、网络通信和嵌入式系统。它具有以下几个主要特点:

安装 FlatBuffers

在开始之前,我们需要安装 FlatBuffers。以下是一些常见的安装方法:

使用 Homebrew(macOS)

brew install flatbuffers

使用 apt-get(Ubuntu)

sudo apt-get install flatbuffers-compiler

从源码编译

git clone https://github.com/google/flatbuffers.git
cd flatbuffers
cmake -G "Unix Makefiles"
make
sudo make install

快速入门示例

让我们通过一个简单示例来看看 FlatBuffers 是如何工作的。

定义模型

首先,我们需要定义一个数据模型。假设我们有一个包含人物信息的模型:

// person.fbs
namespace MyGame.Sample;

table Person {
id:int;
name:string;
age:int;
email:string;
}

root_type Person;

保存上述定义为 person.fbs 文件。

编译 FlatBuffers Schema

接下来,我们需要编译这个 schema 文件。这将生成用于我们应用程序的代码。

flatc --cpp person.fbs

使用 FlatBuffers 序列化和反序列化数据

现在我们已经生成了所需的代码,可以在 C++ 中使用它来序列化和反序列化数据。以下是一个简单的示例:

序列化

#include "person_generated.h"  // 自动生成的头文件
#include "flatbuffers/flatbuffers.h"
#include 

int main() {
 flatbuffers::FlatBufferBuilder builder;

 auto name = builder.CreateString("John Doe");
 auto email = builder.CreateString("john.doe@example.com");

 MyGame::Sample::PersonBuilder personBuilder(builder);
 personBuilder.add_id(123);
 personBuilder.add_name(name);
 personBuilder.add_age(30);
 personBuilder.add_email(email);

 auto person = personBuilder.Finish();

 builder.Finish(person);

 // 获取缓冲区指针和大小
 uint8_t* buf = builder.GetBufferPointer();
 int size = builder.GetSize();

 // 将缓冲区写入文件或发送
 std::cout << "Serialized data size: " << size << " bytes\n";

 return 0;
}

反序列化

#include "person_generated.h"
#include 

int main() {
 // 假设 buf 和 size 是从文件或网络读取的序列化数据
 uint8_t* buf = ...;
 int size = ...;

 auto person = MyGame::Sample::GetPerson(buf);

 std::cout << "ID: " << person->id() << "\n";
 std::cout << "Name: " << person->name()->str() << "\n";
 std::cout << "Age: " << person->age() << "\n";
 std::cout << "Email: " << person->email()->str() << "\n";

 return 0;
}

FlatBuffers 与其他数据格式的对比

让我们看看 FlatBuffers 和其他常见数据格式(如 JSON 和 Protocol Buffers)之间的主要差异。

FlatBuffers vs JSON

JSON 是一种文本格式,易于阅读和调试,广泛用于 web 应用程序。但它有几个缺点:

FlatBuffers 的优势在于:

FlatBuffers vs Protocol Buffers

Protocol Buffers(Protobuf)同样是由 Google 开发的序列化库,也使用二进制格式。它与 FlatBuffers 有相似之处,但也有一些关键区别:

性能对比

以下是一个简单的性能对比,可以帮助你更好地理解这些格式之间的差异:

特性

JSON

Protocol Buffers

FlatBuffers

解析速度

中等

数据大小

类型安全

序列化/反序列化

需要

需要

不需要(零拷贝)

可读性

向后兼容

较弱

较强

实践示例:FlatBuffers vs JSON

为了更直观地展示 FlatBuffers 的优势,我们来对比一下使用 FlatBuffers 和 JSON 序列化与反序列化的代码。

使用 JSON

序列化

#include 
#include 

using json = nlohmann::json;

int main() {
  json person;
  person["id"] = 123;
  person["name"] = "John Doe";
  person["age"] = 30;
  person["email"] = "john.doe@example.com";

  std::string serialized_data = person.dump();
  std::cout << "Serialized JSON data: " << serialized_data << "\n";

  return 0;
}

反序列化

#include 
#include 

using json = nlohmann::json;

int main() {
  std::string serialized_data = R"({"id":123,"name":"John Doe","age":30,"email":"john.doe@example.com"})";
  
  auto person = json::parse(serialized_data);
  std::cout << "ID: " << person["id"] << "\n";
  std::cout << "Name: " << person["name"] << "\n";
  std::cout << "Age: " << person["age"] << "\n";
  std::cout << "Email: " << person["email"] << "\n";

  return 0;
}

使用 FlatBuffers

上文已展示了如何在 C++ 中使用 FlatBuffers 进行序列化和反序列化。可以看到,虽然 JSON 的代码更为直观和易于调试,但 FlatBuffers 在性能和效率上具有显著优势,尤其是在处理大量数据或需要高频率数据交换的场景中。

结论

FlatBuffers 非常适合需要高性能数据传输的应用程序。它在速度、数据大小和类型安全性方面提供了显著优势,尽管学习曲线稍陡,但其性能提升和资源节省是值得的。

如果你的项目需要频繁的数据交换、高效的存储或需要在多种编程语言之间传递数据,FlatBuffers 是一个值得考虑的选择。希望这篇文章能帮助你更好地理解 FlatBuffers,并在你的项目中有效地应用它。

来源:科学随想录内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯