json与protobuf的速度之争

json是这些年慢慢兴起的轻量级数据交换格式。比起老大哥XML。因其更快的解析速度和更小的体积,可谓是用过的都说好。一般情况下json足够满足你的大多数需求,但是在计算机领域,没有最快,只有更快。
当你的传输数据大到一定程度的时候,json的速度也不能满足你需求的时候,你就需要更快的protobuf。
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言, 独立于平台。(百度百科)。
因为其使用二进制存储,所以会比json更快。但是缺点也是显而易见,二进制存储易读性很差。
我曾遇到要解析40M json的需求。在PC端,使用litjson需要解析10秒钟。但是将相同的内容通过protobuf再导出成bytes。只要17M。缩小了2.5倍左右。但是读取速度只要0.8秒,还包括了数据解析后的处理。
0.1秒和0.008秒可能给人差别不大,但是10秒和0.8秒的差别真的是天壤地别。

如果需要传输的数据量比较大时,protobuf是你的不二选择。

如何使用呢?

我们在unity中只需要使用 protobuf-net 这个dll就行了,下面是其在GitHub上的链接。如何使用他链接内已经非常的清楚了,我在这不重复说了。
其中的坑:
1.
将类导出成protobuf或者是从protobuf导入到类时,基类的属性是无法导入的。所以说使用protobuf的模型类最好还是不要相互继承。这点需要注意。
2.unity在pc端读取2进制文件的文件是没有要求的。.bat.bin都可以用C# 的IO类来读取。但是在安卓端因为没法使用IO。如果通过resourecs.load来读取的话,2进制文件的后缀需要是.bytes。


你可以使用第三方库,如protobuf-json-util来实现C++中JSONProtobuf的功能。个库提供了一些方便的函数和接口,可以帮助你在ProtobufJSON之间进行转换。 首先,你需要在你的C++项目中引入protobuf-json-util库。你可以在GitHub上找到该库的源代码并进行下载和安装。 然后,你需要定义你的Protobuf消息和相应的JSON格式。在Protobuf中,你可以使用.proto文件定义消息结构,在JSON中,你可以使用类似的结构来表示相同的数据。 接下来,你可以使用protobuf-json-util库提供的函数来实现JSONProtobuf的转换。你可以使用`ParseFromJsonString()`函数将JSON字符串解析Protobuf消息对象,使用`SerializeToJsonString()`函数将Protobuf消息对象序列化为JSON字符串。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <string> #include <protobuf-json-util/json_util.h> #include "your_protobuf_message.pb.h" int main() { // 定义一个Protobuf消息对象 YourProtobufMessage message; // 从JSON字符串解析Protobuf消息对象 std::string json = R"( { "field1": 123, "field2": "hello", "field3": true } )"; json_util::Status status = json_util::ParseFromJsonString(json, &message); if (!status.ok()) { std::cerr << "Failed to parse JSON: " << status.error_message() << std::endl; return 1; } // 将Protobuf消息对象序列化为JSON字符串 std::string serialized_json = json_util::SerializeToJsonString(message); std::cout << "Serialized JSON: " << serialized_json << std::endl; return 0; } ``` 请确保按照protobuf-json-util库的文档进行正确的安装和配置,并根据你的实际需求修改示例代码中的消息类型和字段名。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值