protobuf使用
2022/4/25 23:12:46
本文主要是介绍protobuf使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
简介
protobuf是google开源的数据传输格式,作用类似于json/xml
github地址https://github.com/protocolbuffers/protobuf
效率
由于protobuf采用二进制编码,不同于json/xml,其编码后的格式不便于人为观察,用于对传输效率/网络包等有特殊要求的服务,目前截止发文,已经支持了C++/java/go/js/python等10中语言,下图,换句话说,除了以上语言,其他语言暂时还用不了prototbuf编码.
有利有弊,在牺牲可读性的同时,其可以获取更高的效率,根据这篇博客作者的实际测试,其结果如下
结构体{"phone":{"phoneName":"idol3","price":2000,"top":1},"watch":{"watchName":"tcl wtch","top":1,"price":1000}}
1个结构体测试
-
空间效率
- Json:107个字节
- Protobuf:32个字节
-
时间效率
- Json序列化: 1ms , 反序列化:0ms
- Protobuf 序列化: 0ms 反序列化:0ms
1000个结构体测试
-
空间效率
- Json:4206个字节
- Protobuf:1332个字节
-
时间效率
- Json序列化: 4ms , 反序列化:1ms
- Protobuf 序列化: 1ms 反序列化:0ms
定义
protobuf最基础的使用就是写一个配置文件,这个文件定义了我要传输的数据是什么样子,比如我要传一个文件大小,还有名字,那么这个文件就可以定义为
syntax = "proto2";//可选proto2,proto3 package file; message file { required int32 id = 1; required string name = 2; optional int32 size = 3; }
其中:
- stntax就是要定义的proto版本,目前仅有两个版本可选,两个版本生成的代码不同
- package就是包名,和golang中定义的包名一个意思,在c++里应该会变成命名空间
- message就是对应golang里的一个结构体,或者说要传输的文件最小单位,类似于json里的一个对象,在golang里会变成一个结构体,java里是一个类,c++里也是一个结构体应该,具体还没测试
- int32/string好解释,就是数据类型,proto支持好多数据类型,参考附录[1]
- id/name/size 就是字段的名字,
- 1/2/3就是编码值,一般就是按顺序写,便于proto进行编码
- 最后require/option/repeated,require代表该字段出现次数为1,option代表该字段出现次数为01,repeated代表该字段出现次数为0n,也就是数组
使用
使用来讲主要是用prorotc
上github源码,download下来,按说明进行./configure && make && make install就行
使用功能命令
#c++ protoc --cpp_out=$DST_DIR $SRC_DIR/file.proto #go protoc --go_out=$DST_DIR $SRC_DIR/file.proto
其他语言类似,然后将生成的.h(c++)或.go(golang)导入项目中进行使用即可,比如golang
import "github.com/golang/protobuf/proto" ... f := new(file) f.name = "book" data := proto.Marshal(f) //压缩 nf := new(file) proto.Unmarshal(nf,data) //解压 name := nf.getName() //name = "book" ...
附录
- [https://www.jianshu.com/p/362a6cdb63c5]https://www.jianshu.com/p/362a6cdb63c5
这篇关于protobuf使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?