c++ - protobuf vs rapidjson data format
使用RapidJSON,我能够将任何类型的数据(由RapidJSON支持)存储为键的值。我可以在protobuf中这样做吗?如果是这样,怎么办?
我选择protobuf而不是RapidJSON的原因是因为它的速度(而RapidJSON中的键比较实际上是"字符串"比较,这比较昂贵)。
还是有其他选择吗?也许flatbuffers?
需求是根据int类型键存储任何类型的数据。比常规json更快的序列化/反序列化。
从Cangular寻找答案。
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值,再次嵌套就可以很好地工作。
最后值得一提的替代方法是
在protobuf中,通常您有一个固定合同,可以将给定密钥预先解释为给定类型,但是:还有扩展的概念。通过扩展,可以根据字段号存储任意数据;这适用于也可以使用常规API表示的任何类型。
扩展API的便利性和性能取决于实现方式,但是从官方C API应该完全可以使用。
有关扩展的关键点在于,只有用户才需要了解它们。