Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;-protobuf vs rapidjson数据格式_C++_Json_Protocol Buffers_Rapidjson_Flatbuffers - Fatal编程技术网

C++ c++;-protobuf vs rapidjson数据格式

C++ c++;-protobuf vs rapidjson数据格式,c++,json,protocol-buffers,rapidjson,flatbuffers,C++,Json,Protocol Buffers,Rapidjson,Flatbuffers,使用rapidJSON,我能够存储任何类型的数据(rapidJSON支持)作为键的值。我可以用protobuf做吗?如果是,怎么做 我之所以选择protobuf而不是rapidJSON,是因为它的速度(rapidJSON中的键比较实际上是一个“字符串”比较,成本很高)。 或者还有其他选择吗?也许是平板缓冲器 需求是根据int类型键存储任何类型的数据。比常规json更快的序列化/反序列化 从C++透视图中寻找答案。在原BUFF中,通常有一个固定的契约,预先将给定的键解释为给定的类型,但是:也有扩展

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

我之所以选择protobuf而不是rapidJSON,是因为它的速度(rapidJSON中的键比较实际上是一个“字符串”比较,成本很高)。 或者还有其他选择吗?也许是平板缓冲器

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

从C++透视图中寻找答案。

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

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


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

Protobuf和FlatBuffer都有字典功能(请参阅和字典下的)。但是,这两种方法都有一个大问题,就是不方便将值设置为任意值,因为它们都是由模式定义的,这意味着您必须为值指定实际的类型。您可以通过定义所有可能类型的联合来解决这个问题,但它从来没有JSON那么方便

但是,FlatBuffers有一种专用格式,用于存储没有模式的任何值:。这比JSON快得多,更紧凑,并且使用更少的额外内存来读取(无)

平面缓冲区有能力使用int作为键,但FlexBuffers还没有,因此您可以考虑将FlexBuffer作为一个值存储在一个缓冲区int字典中。 这两种格式都从JSON解析并输出到JSON,即使是嵌套的

无法就地修改FlexBuffers。FlatBuffers可以使用其对象API。因此,嵌套也可以很好地工作,只要您确定在它发生变化时重新生成整个FlexBuffer值

值得一提的最后一种选择是使用
std::map
(或
unordered_map
)直接存储FlexBuffers的映射。这很简单,但现在的问题是没有一个方便的方法来存储整个东西