3

使用 rapidJSON,我能够将任何类型的数据(由 rapidJSON 支持)存储为键值。我可以在 protobuf 中这样做吗?如果是这样,怎么做?

我选择 protobuf 而不是 rapidJSON 的原因是它的速度(并且 rapidJSON 中的关键比较实际上是一个“字符串”比较,成本很高)。或者有什么替代方案吗?也许是平面缓冲区?

要求是针对 int 类型键存储任何类型的数据。比常规 json 更快的序列化/反序列化。

从 C++ 的角度寻找答案。

4

2 回答 2

1

在 protobuf 中,通常你有一个固定的合约,它将给定的键预先解释为给定的类型,但是:还有扩展的概念。通过扩展,可以根据字段编号存储任意数据;这适用于也可以使用常规 API 表达的任何类型。

扩展 API 的便利性和性能取决于实现,但它应该完全可以从官方 C++ API 中使用。

关于扩展的关键点是只有消费者需要理解它们。

于 2017-06-20T12:57:47.680 回答
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 值发生变化时可以重新生成整个 FlexBuffer 值,嵌套就可以很好地工作。

最后一个值得一提的替代方案是直接存储 FlexBuffers 的映射std::map<int, std::vector<uint8_t>>(or )。unordered_map这更简单,但现在你遇到的问题是没有一种方便的方式来存储整个东西。

于 2017-06-20T14:52:28.110 回答