一、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-tw/n/276835.html