因为在学习golang的gRPC框架时需要用到protobuf,所以重点学习一下。之前也曾接触过,因为它是把数据压缩成二进制从而降低了压缩大小,在网络传输的时候效率更高。相对于json,它的文件体积更小,相对于xml,解析速度更快。
protobuf的数据格式有一下几种:
1,enum类型:类似与很多语言的枚举类型
enum Sanguo{
Wei=1;
Shu=2;
Wu=3;
}
2,message类型:类似于其他语言的类或者结构体
message Student{
required string sid;
required string name;
string address;
string telephone;
int32 age;
}
required表示在序列化和反序列化之前必须赋值,每个message中必须有一个字段为required类型,与此类似的还有optional,repeated类型。
service UserService{
rpc CreateUser(User) returns (ResultResponse){};
rpc GetUserInfo(User) returns (User){};
rpc DeleteUser(User) returns (ResultResponse){};
}
但是在pb里没有int类型,而只有int32,int64。具体的类型表后面详细论述。
3,service类型:类似于其他语言中的方法接口。
service UserService{
rpc CreateUser(User) returns (ResultResponse){};
rpc GetUserInfo(User) returns (User){};
rpc DeleteUser(User) returns (ResultResponse){};
}
rpc表示方法的类型,User表示传入的参数,参数要求必须是pb中自定义的message类型,如果没有合适的message类型可以自定义个通用的参数类型,返回时为returns而不是return,返回的类型也必须是message类型。
但是与message类型不同的是service不用指定其属性的序号。
4,嵌套类型:就是一个message中的字段是另一个message类型
message Person{
Student s=1
string Idcard =2
}
pb中主要的类型就这么多,但是还会用到一些常见的属性:
package包:package info表示序列化为指定语言类型后的命名空间名称。
pb类型对照:
.proto Type | Notes | C++ Type | Java Type |
double |
| double | double |
float |
| float | float |
int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int |
int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long |
uint32 | Uses variable-length encoding. | uint32 | int |
uint64 | Uses variable-length encoding. | uint64 | long |
sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int |
sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long |
fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 228. | uint32 | int |
fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 256. | uint64 | long |
sfixed32 | Always four bytes. | int32 | int |
sfixed64 | Always eight bytes. | int64 | long |
bool |
| bool | boolean |
string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String |
bytes | May contain any arbitrary sequence of bytes. | string | ByteString |