syntax = "proto3";
import "google/protobuf/any.proto";
package XBruce.Protobuf;
service SearchService {
rpc GetBooks(GetBooksRequest) returns (GetBooksResponse);
}
message Book
{
enum BookType{
reserved 2, 15, 9 to 11, 40 to max;
reserved "Chinese", "English";
UNIVERSAL = 0;
WEB = 1;
LOCAL = 3;
NEWS = 4;
PRODUCTS = 5;
}
message BookWriter{
string name = 1;
string tel = 2;
}
string name = 1;
int32 pages = 2;
float price = 3;
bytes content = 4;
google.protobuf.Any object = 5;
repeated BookWriter authors = 6;
reserved 7;
}
message GetBooksRequest{
int requestId = 1;
Book.BookType book_type = 2;
Book.BookWriter author = 3;
}
message GetBooksResponse{
int requestId = 1;
map<string, Book> books= 2;
}
map使用注意事项:
key_type 可以是任何 int 或者 string 类型(任何的标量类型,具体可以见上面标量类型对应表格,但是要除去 float、double 和 bytes)
枚举值也不能作为 key。
key_type 可以是除去 map 以外的任何类型。
需要特别注意的是 :
map 是不能用 repeated 修饰的。
线性数组和 map 迭代顺序的是不确定的,所以你不能依靠你的map 是在一个特定的顺序。
为 .proto 生成文本格式时,map 按 key 排序。数字的 key 按数字排序。
从数组中解析或合并时,如果有重复的 key,则使用所看到的最后一个 key(覆盖原则)。从文本格式解析映射时,如果有重复的 key,解析可能会失败。
Protocol Buffer 虽然不支持 map 类型的数组,但是可以转换一下,用以下思路实现 maps 数组:
message MapFieldEntry {
key_type key = 1;
value_type value = 2;
}
repeated MapFieldEntry map_field = N;
网友评论