2017-06-20 155 views
2

使用rapidJSON我能夠存儲任何類型的數據(由rapidJSON支持)作爲對照鍵的值。我可以在protobuf中做到這一點嗎?如果是這樣,怎麼樣?C++ - protobuf與rapidjson數據格式

我之所以選擇protobuf over rapidJSON是因爲它的速度(和rapidJSON中的關鍵比較實際上是一個「串」比較,代價很大)。 或者還有其他選擇嗎?也許flatbuffers?

要求是存儲任何類型的數據與int類型的鍵。比常規的json更快的序列化/反序列化。

尋找C++視角的答案。

回答

1

在protobuf的,通常你有一個預先給出解釋按鍵給出類型的固定合同,但:也有一種擴展概念。使用擴展名,可以根據字段號存儲任意數據;這適用於任何可能使用常規API表示的類型。

擴展API的便利性和性能取決於實現,但它應該完全可以從官方C++ API中使用。

關於擴展的關鍵點是隻有消費者需要了解它們。

1

Protobuf和FlatBuffer都具有字典功能(請參見字典下的https://developers.google.com/protocol-buffers/docs/proto#mapshttps://google.github.io/flatbuffers/md__cpp_usage.html)。然而,你可能遇到的最大問題是將值設置爲任意值,這是不方便的,因爲兩者都是由模式定義的,這意味着你必須指定值的實際類型。你可以通過定義所有可能類型的聯合來解決這個問題,但它永遠不會像JSON那樣方便。

然而,FlatBuffers有一個專用的格式來存儲任何值沒有模式:https://google.github.io/flatbuffers/flexbuffers.html。這比JSON快得多,更緊湊,並且使用更少的額外內存來讀取(無)。

FlatBuffers能夠使用int作爲鍵,但FlexBuffers還沒有,因此您可以考慮將FlexBuffer存儲爲FlatBuffer int字典中的值。

這兩種格式都從JSON解析並輸出到JSON,即使嵌套。

FlexBuffers不能就地修改。 FlatBuffers可以使用其對象API。因此,只要您可以在更改時重新生成整個FlexBuffer值,嵌套就可以很好地工作。

值得一提的最後一個選擇是std::map<int, std::vector<uint8_t>>(或unordered_map)直接存儲FlexBuffers的地圖。這很簡單,但現在你遇到的問題是沒有一個方便的方法來存儲整個事情。

+0

有沒有其他格式可以查看? – helix