Protobuf 3学习笔记【语法篇】

Profiler.proto

package Profiler;

message ProfilerDumperCtrl {

 int32 num = 1;

 int32 def_num = 2 [default=10];

 string str = 3;

repeated string rep_str = 4;

}

包名:Profiler , 类似C++的命名空间,主要是用来防止不同消息类型的命名冲突

使用protoc编译器将proto文件编译成C++代码后,该包名会被添加到每个生成的结构体名开头

repeated: 字段属性为可重复字段,该字段可以包含0-n个元素,字段中的元素顺序被保留

= 1, = 2 这些= 号的数字是标识号,对于一个message而言,每个字段必须有一个唯一的标识号

这就是在解码中用来识别各个字段的

下面来认识一下protobuf中定义的基本数据类型:

proto类型 C++类型  备注
double double  
float float  
int32 int32 使用可变长编码,值为负数时不够高效,这种情况请使用sint32
int32  int32 使用可变长编码,值为负数时不够高效,这种情况请使用sint64
sint32 int32 有符号的整形值,编码时比直接用int32高效
sint64 int64 有符号的整形值,编码时比直接用int64高效
uint32 uint32 使用可变长编码
uint64 uint64 使用可变长编码
fixed32 uint32 固定4字节编码,数值总是大于2的28次幂时,比uint32更高效
fixed64 uint64 固定4字节编码,数值总是大于2的56次幂时,比uint64更高效
sfixed32 int32  
sfixed64 int64  
bool bool  
string string 字符串必须是UTF-8编码或者7bit ASCII编码的文本
bytes string 包含任意顺序的字节数据

枚举及其他消息类型

enum statusE

{

  statusInvalid = 0;

       OPEN = 1;

  CLOSED = 2;

}

如果需要引用的message是写在别的proto文件中,可以通过import "xx.proto" 来引入

message也可以嵌套

message Profiler {

  uint32  id = 1;

       message Dumper{

    uint32 id  = 1;

  }

  Dumper dump = 2;

}

原文地址:https://www.cnblogs.com/Arnold-Zhang/p/15354542.html