2017-06-20 11 views
2

rapidJSONを使用していますどのタイプのデータ(rapidJSONでサポートされています)もキーに対する値として保存できます。私はprotobufでそれをすることはできますか?もしそうなら、どうですか?C++ - protobuf vs rapidjsonデータフォーマット

私はrapidJSONでprotobufを選択した理由は、その速度のためです(rapidJSONのキー比較は本当にコストのかかる "文字列"の比較です)。 これに代わる方法はありますか?多分flatbuffers?

必要条件は、int型のキーに対して任意の型のデータを格納することです。通常のjsonよりもシリアライゼーション/デシリアライズが高速になりました。

C++の観点からの回答を探しています。いるProtobufで

答えて

1

通常あなたは事前に解釈与えられた型としてキーを指定した固定の契約を持っていますが、:拡張の概念もあります。拡張子を使用すると、フィールド番号に対して任意のデータを格納できます。これは、通常の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をキーとして使用できますが、FlexBufferはまだ使用されていないため、FlexBufferをFlatBuffer intディクショナリに値として格納することを検討できます。

両方ともフォーマットがJSONから解析され、ネストされていてもJSONに出力されます。

FlexBufferは、インプレースで変更することはできません。 FlatBuffersは、そのオブジェクトAPIを使用してできます。したがって、FlexBufferの値が変更されたときにFlexBufferの値を再生成することができれば、ネスティングはうまくいく可能性があります。

最後に、FlexBuffersのマップを直接保存するstd::map<int, std::vector<uint8_t>>(またはunordered_map)があります。それは簡単ですが、今問題は、全体を保存する便利な方法がないということです。

+0

私は調べることができる他の形式はありますか? – helix

関連する問題