protobuf
优缺点
二进制编码,格式紧凑,编解码快,占用内存小
可读性非常差,不利于调试
命令
protoc [OPTION] PROTO_FILES
基本用法
输出c++代码
protoc --cpp_out=. base.proto
API
基本类型(
uint32
、string
等)提供了set_
方法singular(
单数
) message字段(自定义消息),提供mutalbe_
方法设置值,没有set_
方法repeated字段
_size
查询数量- 下标访问(获取,修改)
add_
添加(返回指针来修改数据)
编码风格(https://developers.google.com/protocol-buffers/docs/style)
消息类型
CamelCase(with an initial capital)
字段
underscore_separated_names
1 | message SongServerRequest { |
枚举
Use CamelCase (with an initial capital) for enum type names and CAPITALS_WITH_UNDERSCORES for value names
1 | enum Foo { |
service
CamelCase (with an initial capital) for both the service name and any RPC method names
1 | service FooService { |
编码原理(https://developers.google.com/protocol-buffers/docs/encoding)
消息结构
Varint
采用类似于UTF-8编码方式,来编码整型数,该数为uint64
类型,负数采用补码,所以占用8B,对应需要10B(ceil((8 * 8) / 7)
)。
每个字节用7bits来编码数字
单字节的最高位(Most Significant Bit),来表示是否还有后续字节(1表示有,0表示没有)。
多字节数采用小端字节序
1 | 1 => 0000 0001 |
源码(encode.go
):
1 | const maxVarintBytes = 10 // maximum length of a varint |
具体有key(tag+type)
,length
,value(int32, int64, uint32, uint64, sint32, sint64, bool, enum)
使用varint
编码。