使用rapidJSON我可以将任何类型的数据(由rapidJSON支持)存储为键的值。我可以在protobuf中做到这一点吗?如果是这样,怎么样?
我选择protobuf而不是rapidJSON的原因是因为它的速度(而且rapidJSON中的密钥比较实际上是一个“字符串”比较,这是昂贵的)。 或者有其他替代方案吗?也许是flatbuffers?
要求是针对int类型键存储任何类型的数据。比常规json更快的序列化/反序列化。
从C ++角度寻找答案。
答案 0 :(得分:1)
在protobuf中,通常你有一个固定的合约,它将给定的密钥预先解释为给定的类型,但是:还有 extensions 的概念。通过扩展,可以针对字段数存储任意数据;这适用于任何也可以使用常规API表达的类型。
扩展API的便利性和性能取决于实现,但它应该可以从官方C ++ API中完全使用。
关于扩展的关键点是只有消费者需要理解它们。
答案 1 :(得分:1)
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地图。这更简单,但现在你遇到的问题是没有一种方便的方法来存储整件事。