自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

還在用Protocol Buffers?快來看看FlatBuffers!

開發(fā) 前端
FlatBuffers 非常適合需要高性能數(shù)據(jù)傳輸?shù)膽?yīng)用程序。它在速度、數(shù)據(jù)大小和類型安全性方面提供了顯著優(yōu)勢(shì),盡管學(xué)習(xí)曲線稍陡,但其性能提升和資源節(jié)省是值得的。

如果你正在尋找一種快速、高效的跨平臺(tái)數(shù)據(jù)序列化庫,F(xiàn)latBuffers 絕對(duì)是一個(gè)值得探索的選擇。由 Google 開發(fā),F(xiàn)latBuffers 旨在提供比其他序列化庫(例如 Protocol Buffers 和 JSON)更高性能的解決方案。今天,我們將深入了解 FlatBuffers 的工作原理,通過一些代碼示例展示如何使用它,并與其他常見的數(shù)據(jù)格式進(jìn)行對(duì)比。

什么是 FlatBuffers?

FlatBuffers 是一個(gè)高效的、跨平臺(tái)的序列化庫,特別適用于游戲開發(fā)、網(wǎng)絡(luò)通信和嵌入式系統(tǒng)。它具有以下幾個(gè)主要特點(diǎn):

  • 零拷貝反序列化:無需解析或解包即可直接訪問數(shù)據(jù)。
  • 向后兼容:可以在不破壞現(xiàn)有數(shù)據(jù)格式的情況下擴(kuò)展結(jié)構(gòu)。
  • 多語言支持:支持多種編程語言,包括 C++, C#, C, Go, Java, JavaScript, PHP, Python, Rust, Swift 等。

安裝 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

快速入門示例

讓我們通過一個(gè)簡(jiǎn)單示例來看看 FlatBuffers 是如何工作的。

定義模型

首先,我們需要定義一個(gè)數(shù)據(jù)模型。假設(shè)我們有一個(gè)包含人物信息的模型:

// person.fbs
namespace MyGame.Sample;

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

root_type Person;

保存上述定義為 person.fbs 文件。

編譯 FlatBuffers Schema

接下來,我們需要編譯這個(gè) schema 文件。這將生成用于我們應(yīng)用程序的代碼。

flatc --cpp person.fbs

使用 FlatBuffers 序列化和反序列化數(shù)據(jù)

現(xiàn)在我們已經(jīng)生成了所需的代碼,可以在 C++ 中使用它來序列化和反序列化數(shù)據(jù)。以下是一個(gè)簡(jiǎn)單的示例:

序列化

#include "person_generated.h"  // 自動(dòng)生成的頭文件
#include "flatbuffers/flatbuffers.h"
#include <iostream>

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);

 // 獲取緩沖區(qū)指針和大小
 uint8_t* buf = builder.GetBufferPointer();
 int size = builder.GetSize();

 // 將緩沖區(qū)寫入文件或發(fā)送
 std::cout << "Serialized data size: " << size << " bytes\n";

 return 0;
}

反序列化

#include "person_generated.h"
#include <iostream>

int main() {
 // 假設(shè) buf 和 size 是從文件或網(wǎng)絡(luò)讀取的序列化數(shù)據(jù)
 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 與其他數(shù)據(jù)格式的對(duì)比

讓我們看看 FlatBuffers 和其他常見數(shù)據(jù)格式(如 JSON 和 Protocol Buffers)之間的主要差異。

FlatBuffers vs JSON

JSON 是一種文本格式,易于閱讀和調(diào)試,廣泛用于 web 應(yīng)用程序。但它有幾個(gè)缺點(diǎn):

  • 性能:JSON 是文本格式,解析速度較慢。
  • 大小:JSON 數(shù)據(jù)通常比二進(jìn)制格式大。
  • 類型安全:JSON 缺乏嚴(yán)格的類型約束。

FlatBuffers 的優(yōu)勢(shì)在于:

  • 速度:由于是二進(jìn)制格式,解析和訪問數(shù)據(jù)非常快。
  • 大?。憾M(jìn)制格式通常比 JSON 更小,占用更少的存儲(chǔ)空間和網(wǎng)絡(luò)帶寬。
  • 類型安全:FlatBuffers 使用 schema 定義數(shù)據(jù)結(jié)構(gòu),提供了更強(qiáng)的類型安全性和數(shù)據(jù)驗(yàn)證。

FlatBuffers vs Protocol Buffers

Protocol Buffers(Protobuf)同樣是由 Google 開發(fā)的序列化庫,也使用二進(jìn)制格式。它與 FlatBuffers 有相似之處,但也有一些關(guān)鍵區(qū)別:

  • 延遲:Protobuf 使用了“序列化-反序列化”的方式,這意味著數(shù)據(jù)在傳輸和存儲(chǔ)時(shí)需要進(jìn)行編碼和解碼。而 FlatBuffers 的零拷貝反序列化允許直接訪問數(shù)據(jù),減少了延遲。
  • 動(dòng)態(tài)性:Protobuf 的 schema 更加靈活,可以更容易地進(jìn)行字段的增加或刪除。FlatBuffers 雖然也支持向后兼容,但在處理復(fù)雜的動(dòng)態(tài)數(shù)據(jù)模型時(shí)可能不如 Protobuf 方便。
  • 生態(tài)系統(tǒng):Protobuf 可能擁有更成熟和廣泛的生態(tài)系統(tǒng),特別是在 Google 內(nèi)部的許多項(xiàng)目中都在使用。

性能對(duì)比

以下是一個(gè)簡(jiǎn)單的性能對(duì)比,可以幫助你更好地理解這些格式之間的差異:

特性

JSON

Protocol Buffers

FlatBuffers

解析速度

中等

數(shù)據(jù)大小

類型安全

強(qiáng)

強(qiáng)

序列化/反序列化

需要

需要

不需要(零拷貝)

可讀性

向后兼容

較弱

較強(qiáng)

強(qiáng)

實(shí)踐示例:FlatBuffers vs JSON

為了更直觀地展示 FlatBuffers 的優(yōu)勢(shì),我們來對(duì)比一下使用 FlatBuffers 和 JSON 序列化與反序列化的代碼。

使用 JSON

序列化

#include <iostream>
#include <nlohmann/json.hpp>

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 <iostream>
#include <nlohmann/json.hpp>

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 進(jìn)行序列化和反序列化??梢钥吹剑m然 JSON 的代碼更為直觀和易于調(diào)試,但 FlatBuffers 在性能和效率上具有顯著優(yōu)勢(shì),尤其是在處理大量數(shù)據(jù)或需要高頻率數(shù)據(jù)交換的場(chǎng)景中。

結(jié)論

FlatBuffers 非常適合需要高性能數(shù)據(jù)傳輸?shù)膽?yīng)用程序。它在速度、數(shù)據(jù)大小和類型安全性方面提供了顯著優(yōu)勢(shì),盡管學(xué)習(xí)曲線稍陡,但其性能提升和資源節(jié)省是值得的。

如果你的項(xiàng)目需要頻繁的數(shù)據(jù)交換、高效的存儲(chǔ)或需要在多種編程語言之間傳遞數(shù)據(jù),F(xiàn)latBuffers 是一個(gè)值得考慮的選擇。希望這篇文章能幫助你更好地理解 FlatBuffers,并在你的項(xiàng)目中有效地應(yīng)用它。

責(zé)任編輯:武曉燕 來源: 科學(xué)隨想錄
相關(guān)推薦

2022-11-28 07:32:46

迭代器remove數(shù)據(jù)庫

2022-02-23 14:18:53

If-Else入?yún)?/a>接口

2018-03-06 09:54:48

數(shù)據(jù)庫備份恢復(fù)

2018-05-02 15:41:27

JavaScript人臉檢測(cè)圖像識(shí)別

2023-03-17 18:58:36

日志查詢同步

2023-11-27 19:39:46

Goprotobuf

2018-01-30 17:54:37

數(shù)據(jù)庫MySQLSQL Server

2021-04-19 09:23:26

數(shù)字化

2018-03-12 10:35:01

LinuxBash快捷鍵

2018-04-18 17:08:45

2020-04-16 09:35:53

數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)數(shù)據(jù)分析

2022-05-05 09:14:41

AlpineDocker鏡像開發(fā)

2022-05-12 15:17:09

GPU微軟神經(jīng)網(wǎng)絡(luò)

2020-08-04 07:02:00

TCPIP算法

2017-11-24 08:00:55

前端JSCSS

2024-04-16 13:34:26

JSONMsgpack存儲(chǔ)

2020-11-24 06:00:55

PythonPython之父編程語言

2022-01-21 08:21:02

Web 安全前端程序員

2025-01-13 00:00:05

2025-01-13 07:10:00

前端開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)