}
只是用了大括号进行括起来,注意标点!这个和上面的那个例子是一致的。
7、 更新一个消息类型
一个已经存在的message类型不再满足你的需要,在不改变以前定义的格式的基础上进行更新。遵照如下规则:
A、 不要改变已经存在字段的数字标签。
B、 任何你添加的新字段应该是optional或者repeated类型。
C、 非必须字段可以被删除,同时标签数字在你更新的message类型中不再被使用。(更好的方法是为字段更名,可以加上OBSOLETE_前缀,这样将来使用你的proto文件的用户就不能意外的使用这个数字了)
D、一个非必须的字段可以转变为一个扩展,反过来也一样,同时类型和数字保持不变。
E、 int32、uint32、int64、uint64和bool都是兼容的。
F、 sint32和sint64是兼容的,但是并不与其他整型数兼容。
G、string和bytes相互兼容。
H、 嵌入message和bytes兼容
I、 fixed32和sfixed32,fixed64和sfixed64兼容
8、 扩展
举例:
message Foo {
// ...
extensions 100 to 199;
}
字段数字[100, 199]保留用以扩展,其他用户可以再Foo中使用这些标记数字添加新的字段,如下:
extend Foo {
optional int32 bar = 126;
}
这样就在Foo中添加了类型为int32的新字段bar,在编译生成的文件中访问扩展字段的方法稍有不同:
Foo foo;
foo.SetExtension(bar, 15);
其他的处理方法有:HasExtension()
,ClearExtension()
,GetExtension()
,MutableExtension()
, andAddExtension()
.
说明:扩展字段可以是任何字段类型,包括message类型。
扩展的嵌套:
message Baz {
extend Foo {
optional int32 bar = 126;
}
…
}
C++访问扩展的方法:
Foo foo;
foo.SetExtension(Baz::bar, 15);
唯一不同的就是在bar前面加了个Baz,就这么简单。
提倡不是用嵌套的扩展。
扩展标签数字的选择:
message Foo {
extensions 1000 to max;
}
max
= 229 – 1, 或者 536,870,911.但是不包含19000~19999,具体原因参照上文。
9、 包
举例:
package foo.bar;
message Open { … }
在另外一个message中使用这个包的方法:
message Foo {
…
required foo.bar.Open open = 1;
…
}
生成的C++代码中package被声明为命名空间。Open将在命名空间foo::bar中。
10、 服务的定义
举例如下:
service SearchService {
rpc Search (SearchRequest) returns (SearchResponse);
}
11、 选项
。。。
12、 产生你的类
下载源码,配置并编译源码生成编译器。编译参数:
protoc –proto_path=IMPORT_PATH –cpp_out=DST_DIR –java_out=DST_DIR –python_out=DST_DIR path/to/file.proto
说明:
a. LMPORT_PATH是指定你的.proto文件坐在的目录。
b. 提供以下输出:
–cpp_out在DST_DIR产生C++代码
–java_out在DST_DIR产生Java代码
–python_out在DST_DIR产生python代码
c. 必须提供一个或者多个.proto文件作为输入。当然多个.proto文件可以同时被指定编译。