使用rapidJSON,我能够将任何类型的数据(由rapidJSON支持)存储为键的值。我能在protobuf中做到这一点吗?如果是这样的话,是怎么做的?
我选择protobuf而不是rapidJSON的原因是因为它的速度(而rapidJSON中的键比较实际上是“字符串”比较,代价很高)。还有没有别的选择呢?也许是扁平缓冲区?
需求是根据int类型的键存储任何类型的数据。比常规json更快的序列化/反序列化。
从C++的角度寻找答案。
发布于 2017-06-20 20:57:48
在protobuf中,通常有一个固定的约定,它将给定的键预先解释为给定的类型,但是:还有扩展的概念。通过扩展,可以根据字段编号存储任意数据;这适用于也可以使用常规API表示的任何类型。
扩展接口的便利性和性能取决于实现,但它应该可以从官方的C++接口完全使用。
关于扩展的关键点是,只有消费者需要理解它们。
发布于 2017-06-20 22:52:28
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可以使用它的对象应用程序接口。因此,嵌套也可以很好地工作,只要您可以在整个FlexBuffer值发生变化时重新生成它。
最后一个值得一提的替代方案是直接存储FlexBuffers映射的std::map<int, std::vector<uint8_t>> (或unordered_map)。这很简单,但现在的问题是没有一种方便的方法来存储整个数据。
https://stackoverflow.com/questions/44653430
复制相似问题