BZ易风

导航

 

数据类型

double: 浮点数
float: 单精度浮点
int32: int类型,使用可变长编码,编码负数不够高效,如果有负数那么使用sint32
sint32: int类型,使用可变长编码, 有符号的整形,比通常的int32高效;
uint32: 无符号整数 使用可变长编码方式;
int64 long long , 使用可变长编码方式。编码负数时不够高效——如果有负数,可以使用sint64;
sint64 long long  使用可变长编码方式。有符号的整型值。编码时比通常的int64高效;
uint64: 无符号整数 使用可变长编码方式;
fixed32 : 总是4个字节。如果数值总是比总是比2^28大的话,这个类型会比uint32高效。
fixed64: 总是8个字节。如果数值总是比总是比2^56大的话,这个类型会比uint64高效。
sfixed32: 总是4个字节。
sfixed64: 总是8个字节。
bool: bool值
string: 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。
bytes: 可能包含任意顺序的字节数据。类似java的ByteString以及 c++ string;

proto语法

//注释:和 c/c++ 一样 双斜杠
syntax = "proto2";    //proto2协议

// 为了防止命令冲突,添加包名,这样不同的语言会使用各自的包来做, 比如 c/c++是名字空间
package test;    //定义包 package声明符 如:命名空间

//枚举enum
enum Direction{
    EAST = 1;
    SOUTH = 2;
    WEST = 3;
    NORTH = 4;
}

//message 定义一个消息类型
message my_person{    //消息开始
    //字段规则 字段类型 字段名字 字段标识号(从1开始累加)

    //required: 表示该值是必须要设置的,一个格式良好的消息一定要含有1个这种字段。
    required bytes name = 1;    //每定义完一个成员 分号结尾

    //optional:  可以不用设置, 如果不设置将不会被编码进去,当解 析消息时,如果它不包含optional的元素值,那么解析出来的对象中的对应字段就被置为默认值。
    optional unit32 sex = 2;

    //repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复,相当于java中的List, c/c++ vector数组;
    repeated uint32 set = 3; //存放unit3类型的动态数组
} //消息结束

// message嵌套调用
message address_book {
    repeated my_person persons = 1; // 人物联系表 链接message my_person 存放my_person类型的动态数组
}

proto2和proto3区别

1: 字段规则移除了 “required”,,“optional”改成了"singular"
2: 语言增加 Go、Ruby、JavaNano 支持;
3: 移除了 default 选项, roto3 中,字段的默认值只能根据字段类型由系统决定
4: 枚举类型的第一个字段必须为 0
5: 

  • 移除了对分组的支持: 分组的功能完全可以用消息嵌套的方式来实现,并且更清晰。
  • 移除了对扩展的支持,新增了 Any 类型
  • 增加了 JSON 映射特性
posted on 2021-09-14 12:59  BZ易风  阅读(165)  评论(0编辑  收藏  举报