C++ - protobuf与rapidjson数据格式
使用rapidJSON我能够存储任何类型的数据(由rapidJSON支持)作为对照键的值。我可以在protobuf中做到这一点吗?如果是这样,怎么样?C++ - protobuf与rapidjson数据格式
我之所以选择protobuf over rapidJSON是因为它的速度(和rapidJSON中的关键比较实际上是一个“串”比较,代价很大)。 或者还有其他选择吗?也许flatbuffers?
要求是存储任何类型的数据与int类型的键。比常规的json更快的序列化/反序列化。
寻找C++视角的答案。
在protobuf的,通常你有一个预先给出解释按键给出类型的固定合同,但:也有一种扩展概念。使用扩展名,可以根据字段号存储任意数据;这适用于任何可能使用常规API表示的类型。
扩展API的便利性和性能取决于实现,但它应该完全可以从官方C++ API中使用。
关于扩展的关键点是只有消费者需要了解它们。
Protobuf和FlatBuffer都具有字典功能(请参见字典下的https://developers.google.com/protocol-buffers/docs/proto#maps和https://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的地图。这很简单,但现在你遇到的问题是没有一个方便的方法来存储整个事情。
有没有其他格式可以查看? – helix