UP | HOME

protobuf 常用使用注意

Table of Contents

proto 中,所有结构化的数据都为 message

message demo {
    required int32     id = 1;   //id 
    required string    str = 2;  //str 
    optional int32     opt = 3;  //optional field
}

开头第一行不申明 syntax = "proto3";~,则默认使用 ~proto2 进行解析

syntax = "proto3";
...

每个消息定义的每个字段都有唯一的编号。

范围 1 到 15 的字段编号需要一个字节进行编码,包括字段编号和字段类型。范围 16 ~ 2047 中的字段编号需要两个
字节。所以 1 ~ 15 作为非常频繁出现的消息元素。

不能在同一个 reserved 语句中混合字段名称和字段编号

message Test  {
    reserved 1, 2, 5 to 12;
    reserved "age", "addr";
}

各种语言标量类型对应

proto C++ Java Python Go C# PHP
double double double float float64 double float
float float float floata float32 float float
int32 int32 int int int32 int integer
int64 int64 long int/long int64 long integer/string
uint32 uint32 int int/long uint32 uint integer
uint64 uint64 long int/long uint64 ulong integer/string
sint32 int32 int int int32 int integer
sint64 int64 long int/long int64 long integer/string
fixed32 uint32 int int/long uint32 uint integer
fixed64 uint64 long int/long uint64 ulong integer/string

sfixed32 | int32 | int | int | int32 | int | integer |

sfixed64 int64 long int/long int64 long integer/string
bool bool boolean bool bool bool boolean
string string string str/unicode string string string
bytes string ByteString str []byte ByteString string

> php integer/string 注意,64位计算机用 integer,32位用 string

枚举类型一定要有 0 值

枚举为 0 的是作为零值,当不赋值的时候,就会是零值
为了和 proto2 兼容。在 proto2 中,零值必须是第一个值。

map 类型不能用 repeated 修饰

map<k_type, v_type> map_field = N;

example:
map<string, Demo> demos = 3;

JSON Mapping

proto3 支持 JSON 中的规范编码

proto3 JSON JSON example
message object {"name":"josephzeng" …}
enum string "F_A"
map<K,V> object {"k" :"v" …}
repeated V array {v …}
bool true, false true, false
string string "josephzeng"
bytes base64, string "ABDSFSDFDS"
int32, fixed32, uint32 number 1 …
int64, fixed64, uint64 string "1" …
float, double number 1.1 …
Any object {…}
Timestamp string "2012-01-01" …
struct object {…}
Value value JSON value
NullValue null JSON null

常见命名规范

  • message 采用骆驼峰,首字母大写,字段采用下划线
message DemoReq {
    required string my_name = 1;
}
  • 枚举类型采用骆驼峰,首字母大写,字段采用下划线及大写,枚举值分号结束
enum A {
    F_VAL = 0;
    S_VAL = 1;
}

持续更新

Author: josephzeng

Lastmod: <2021-03-20 Sat>

License: CC BY-NC-ND 4.0

First created: 2021-03-20 Sat 00:00
Last updated: 2021-11-25 Thu 23:21
Power by Emacs 27.1 (Org mode 9.4)
© 2017 – 2021 by josephzeng