一、Flatbuffer map
Flatbuffers最為常見的數據結構是「Table」,但我們也可以使用「Map」這樣的數據結構來代替它。Map類似於C++中的std::map和JavaScript中的Object,可以通過字符串鍵值對來快速訪問數據。在Flatbuffers中,我們可以通過「MapEntry」來定義一個Map。
flatbuffers::FlatBufferBuilder fbb;
std::vector<flatbuffers::Offset<flatbuffers::String>> keys_vec;
std::vector<flatbuffers::Offset<MyType>> values_vec;
auto key1 = fbb.CreateString("key1");
auto value1 = CreateMyType(fbb, 1, 2);
auto key2 = fbb.CreateString("key2");
auto value2 = CreateMyType(fbb, 3, 4);
keys_vec.push_back(key1);
values_vec.push_back(value1);
keys_vec.push_back(key2);
values_vec.push_back(value2);
auto my_map = CreateMyMapDirect(fbb, &keys_vec, &values_vec);
上述代碼定義了一個包含兩個鍵值對的Map,其中key1和key2分別對應值為value1和value2的MyType對象。使用Flatbuffers map的好處在於可以極大簡化代碼和數據定義,傳統的方法可能需要定義嵌套的數據結構。
二、Flatbuffers protobuf比較
Flatbuffers和Google Protocol Buffers(GPB)是兩種非常流行的序列化庫,下面我們將它們做一些對比。
1、性能
Flatbuffers優於GNP,Flatbuffer不需要解碼直接擁有原始內存數據,並且不需要反序列化,因此可以在不同設備和語言之間高效地傳遞數據。
2、空間佔用
Flatbuffers比GPB更加高效,Flatbuffers對數據進行緩衝區分配,因此可以減少內存分配的次數。在實踐中,由於PB的標記存儲需求較高,PB會比Flatbuffers擁有更大的序列化文件尺寸。
3、接口設計
Flatbuffers和GPB的接口設計差別較大。Flatbuffers需要更多樣化的模式,例如內存池等。GPB的設計傾向於ATL/IDL類型定義,因而在不同語言之間交互更加方便。
三、Flatbuffer官網
Flatbuffers官網提供了完整的代碼實現,文檔以及示例。如果你有任何Flatbuffers方面的問題,官網都可以提供給你足夠的解決方案。
下面是官網的訪問路徑: https://google.github.io/flatbuffers/
四、Flatbuffer golang
Flatbuffer非常方便地支持Go語言,它擁有自動生成Go代碼的工具和Flatbuffer SDK。下面是一個簡單的Flatbuffers Go示例:
type Monster struct {
Pos *Vec3
Hp byte
Name string
}
builder := flatbuffers.NewBuilder(0)
pos := CreateVec3(builder, 1.0, 2.0, 3.0)
name := builder.CreateString("Monster")
MonsterStart(builder)
MonsterAddPos(builder, pos)
MonsterAddHp(builder, 300)
MonsterAddName(builder, name)
monster := MonsterEnd(builder)
builder.Finish(monster)
上述代碼會生成一個Flatbuffer序列化的Monster對象。
五、Flatbuffer和protobuf選取
Flatbuffers和Google Protobufs都是常見的序列化庫,但它們有着不同的使用場景。在選取使用那種序列化庫之前,我們需要分析自己的使用場景和需求。
1、Protobuf更適合:
如果你需要在大量不同語言的系統之間通信、或者有高度版本化的場景,Protobuf打包效率更高,並且支持更多的語言特性。不過需要注意GBPs的使用場景和限制。
2、Flatbuffers更適合:
如果你需要高效整體的讀取和寫入更快的速度、或者你需要在自己的內存池上序列化和解析數據,Flatbuffers則會更適合你。
總結
Flatbuffers是一種高效的序列化框架,擁有高效、輕量級和高自由度等優點。根據應用需求選擇序列化框架非常重要,希望本文對大家的使用選擇有所啟示。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/276835.html
微信掃一掃
支付寶掃一掃