lua protobuf语法

protobuf语法

1: 目前最新的proto3协议, 很多也用proto2   syntax = "proto2";      syntax = "proto3"; 

2: 注释: 和C/C++一样 双斜杠 //

3: message定义一个消息类型:
     message name {
// 字段规则   字段类型  字段名字  字段标识号
                required string name = 1;
                optional uint32 sex = 2; 
            repeated uint32 set = 3; // 存放 uint3类型的动态数组;

     }

4: required: 表示该值是必须要设置的,一个格式良好的消息一定要含有1个这种字段。

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

6:  repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。表示该值可以重复,相当于java中的List, c/c++ vector数组;

数据类型

1:   数据类型:
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;

enum 包

1:  定义enum
enum Direction {
EAST = 1;
SOUTH = 2;
WEST = 3;
NORTH = 4;
};


2: proto定义包
.proto文件新增一个可选的package声明符,用来防止不同的消息类型有命名冲突
包的声明符会根据使用语言的不同影响生成的代码。对于C++,产生的类会被包装在C++的命名空间中

package tutorial; //package声明符

mesage嵌套

1: message里面可以嵌套其它的message类型  
message Person {}


message AddressBook
{
    repeated Person people = 1;

}

proto3/proto2区别

1: 字段规则移除了 “required”,,“optional”

2: 语言增加 Go、Ruby、JavaNano 支持;
3: 移除了 default 选项, roto3 中,字段的默认值只能根据字段类型由系统决定
4: 枚举类型的第一个字段必须为 0 
5: 其他我们不关心
     移除了对分组的支持: 分组的功能完全可以用消息嵌套的方式来实现,并且更清晰。
     移除了对扩展的支持,新增了 Any 类型

     增加了 JSON 映射特性

----使用proto3

syntax = "proto3";

// 为了防止命令冲突,添加包名,这样不同的语言会使用各自的实现,比如java用包,C/C++是名字空间;
package test;

enum Direction {
    START = 0;
    EAST = 1;
    SOUTH = 2;
    WEST = 3;
    NORTH = 4;
};

// 注释
// protoc这个工具就能把我们的消息编译成对应的 代码
// 消息开始
message myperson {
     string name = 1; // 每定义完一个成员以分号结尾;
     int32 age = 2; // 年级;
     int32 sex = 3; // 性别

     // 定义了一个动态数组,这个里面可以添加 int32类型的元素;
     // 元素可以为空
    repeated int32 array_value = 4;
} // 消息结束

// message的嵌套使用
message address_book {
    repeated myperson persons = 1; // 人物联系表
}


----使用proto2

syntax = "proto2"; //使用哪种协议 proto2



//注释
/*
字段规则
//protoc这个工具就能把我们的消息编译成对应目标语言的代码
//required 表示该值是必须要设置的,一个格式良好的消息一定要含有1个这种字段
//optional 可以不用设置,如果不设置,将不会被编码进去
//repeated 表示该字段可以被重复多次,重复的值会被顺序保留
数据类型
double 双精度浮点数
float
int32
sint32
uint32
int64 long long



bool
string
bytes



*/


package test; //c/c++是命名空间,java就是package包




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



//字段规则 字段数据类型 字段名字 字段标识号


message my_person { //消息开始
required string name = 1; //1是字段标识号 ,语句结束以分号结尾
required int32 age = 2; //年龄
optional int32 sex = 3; //性别
repeated int32 array_value = 4; //存放int32类型的动态数组,元素可以为空



} //消息结束

//message的嵌套使用
message address_book{
repeated my_person persons = 1; //人物地址联系方式表
}











猜你喜欢

转载自blog.csdn.net/qq_28710983/article/details/80637642