概述
Protobuf使用手册
选择版本
syntax 声明可以选择protobuf的编译器版本(v2和v3)
syntax="proto2";选择2版本,各个字段必须明确标注编号以确定序列化后二进制数据字段的位置
syntax="proto3";选择3版本,没有强制使用字段编号
syntax="proto2";选择2版本,各个字段必须明确标注编号以确定序列化后二进制数据字段的位置
syntax="proto3";选择3版本,没有强制使用字段编号
字段修饰符
required
对于required的字段而言,编号初值是必须要提供的,否则字段的便是未初始化的
对于修饰符为required的字段,序列化的时候必须给予初始化,否则程序运行会异常
optional
对于optional的字段而言,如果未进行初始化,那么一个默认值将赋予该字段编号
也可以指定默认值,如示例所示.
repeated
对于repeated的字段而言,该字段可以重复多个,即每个编码单元可能有多个该字段
在高级语言里面,我们可以通过数组来实现,而在proto定义文件中可以使用repeated来修饰,从而达到相同目的。
当然,出现0次也是包含在内的。
对于required的字段而言,编号初值是必须要提供的,否则字段的便是未初始化的
对于修饰符为required的字段,序列化的时候必须给予初始化,否则程序运行会异常
optional
对于optional的字段而言,如果未进行初始化,那么一个默认值将赋予该字段编号
也可以指定默认值,如示例所示.
repeated
对于repeated的字段而言,该字段可以重复多个,即每个编码单元可能有多个该字段
在高级语言里面,我们可以通过数组来实现,而在proto定义文件中可以使用repeated来修饰,从而达到相同目的。
当然,出现0次也是包含在内的。
字段类型
proto Type | C++ Type | Notes |
---|---|---|
int32 | int32 | 有符号32位整型数,非固定长度编码,编码效率比sint32低 |
int64 | int64 | 有符号64位整型数,非固定长度编码 |
uint32 | uint32 | 无符号32位整型数,非固定长度编码 |
uint64 | uint64 | 无符号64位整型数,非固定长度编码 |
sint32 | int32 | 有符号32位整型数,非固定长度编码,效率较高 |
sint64 | int64 | 有符号64位整型数,非固定长度编码,效率较高 |
fixed32 | uint32 | 无符号,固定4字节编码,数据大于2^28时,效率比uint32高 |
fixed64 | uint64 | 无符号,固定8字节编码,数据大于2^56时,效率比uint32高 |
sfixed32 | int32 | 有符号,固定4字节编码 |
sfixed64 | int64 | 有符号,固定8字节编码 |
bool | bool | 布尔值 |
float | float | 浮点数 |
double | double | 浮点数 |
string | string | 必须为UTF-8编码或者7bit ASCII字符串 |
bytes | string | 字节数组 |
字段类型对应二进制类型
字段类型 | 二进制类型 | 二进制编码值 |
---|---|---|
int32,int64,uint32,uint64,sint32,sint64,bool,enum | Varint(可变长度int) | 0 |
fixed64,sfixed64,double | 64bit固定长度 | 1 |
string,bytes,inner messages(内部嵌套),packaed repeated fields(repeated字段) | Length-delimited | 2 |
groups(deprecated) | Start group | 3 |
groups(deprecated) | Endd group | 4 |
fixed32,sfixed32,float | 32bit固定长度 | 5 |
完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | message IntType { optional int32 a_i32 = 1; optional int64 b_i64 = 2; optional sint32 c_s32 = 3; optional sint64 d_s64 = 4; optional sfixed32 e_sf32 = 5; optional sfixed64 f_sf64 = 6; } message UIntType { optional uint32 a_u32 = 1; optional uint64 b_u64 = 2; optional fixed32 c_f32 = 3; optional fixed64 d_f64 = 4; } message FType{ optional float a_f = 1; optional double b_d = 2; optional bool c_b = 3; } message BSType{ optional string a_s = 1; repeated bytes b_bs = 2; } |
嵌套与引用
1.嵌套定义
message定义中可以嵌套定义message,enum
嵌套定义的单元外部可见,引用路径由外到内逐层引用
2.引用
定义package相当于C++的namespace,外部引用时需要package名
引用外部message定义,只需要import外部proto文件即可使用
引用使用相对路径,生成文件时protobuf可以自动处理
完整示例
message定义中可以嵌套定义message,enum
嵌套定义的单元外部可见,引用路径由外到内逐层引用
2.引用
定义package相当于C++的namespace,外部引用时需要package名
引用外部message定义,只需要import外部proto文件即可使用
引用使用相对路径,生成文件时protobuf可以自动处理
完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //user.proto syntax="proto2“; package user; message User{ required sfixed64 uid = 1; enum PhoneType{ NONE = 1; HOME = 2; MOBILE = 3; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = MOBILE]; } repeated PhoneNumber phone = 2; optional sfixed32 age = 3; } message Admin { required sfixed64 uid = 1; optional User.PhoneNumber phone = 2; } |
多个协议文件依赖关系:protoc --cpp_out=${DIR} base-proto-file deliver-proto-file...
依赖问题按相对路径处理import即可解决
http://linghutf.github.io/2016/06/08/protobuf/
最后
以上就是缓慢大雁为你收集整理的Protobuf使用手册Protobuf使用手册 的全部内容,希望文章能够帮你解决Protobuf使用手册Protobuf使用手册 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复