}
只是用了大括號(hào)進(jìn)行括起來(lái),注意標(biāo)點(diǎn)!這個(gè)和上面的那個(gè)例子是一致的。
7、 更新一個(gè)消息類型
一個(gè)已經(jīng)存在的message類型不再滿足你的需要,在不改變以前定義的格式的基礎(chǔ)上進(jìn)行更新。遵照如下規(guī)則:
A、 不要改變已經(jīng)存在字段的數(shù)字標(biāo)簽。
B、 任何你添加的新字段應(yīng)該是optional或者repeated類型。
C、 非必須字段可以被刪除,同時(shí)標(biāo)簽數(shù)字在你更新的message類型中不再被使用。(更好的方法是為字段更名,可以加上OBSOLETE_前綴,這樣將來(lái)使用你的proto文件的用戶就不能意外的使用這個(gè)數(shù)字了)
D、一個(gè)非必須的字段可以轉(zhuǎn)變?yōu)橐粋€(gè)擴(kuò)展,反過(guò)來(lái)也一樣,同時(shí)類型和數(shù)字保持不變。
E、 int32、uint32、int64、uint64和bool都是兼容的。
F、 sint32和sint64是兼容的,但是并不與其他整型數(shù)兼容。
G、string和bytes相互兼容。
H、 嵌入message和bytes兼容
I、 fixed32和sfixed32,fixed64和sfixed64兼容
8、 擴(kuò)展
舉例:
message Foo {
// ...
extensions 100 to 199;
}
字段數(shù)字[100, 199]保留用以擴(kuò)展,其他用戶可以再Foo中使用這些標(biāo)記數(shù)字添加新的字段,如下:
extend Foo {
optional int32 bar = 126;
}
這樣就在Foo中添加了類型為int32的新字段bar,在編譯生成的文件中訪問(wèn)擴(kuò)展字段的方法稍有不同:
Foo foo;
foo.SetExtension(bar, 15);
其他的處理方法有:HasExtension()
,ClearExtension()
,GetExtension()
,MutableExtension()
, andAddExtension()
.
說(shuō)明:擴(kuò)展字段可以是任何字段類型,包括message類型。
擴(kuò)展的嵌套:
message Baz {
extend Foo {
optional int32 bar = 126;
}
…
}
C++訪問(wèn)擴(kuò)展的方法:
Foo foo;
foo.SetExtension(Baz::bar, 15);
唯一不同的就是在bar前面加了個(gè)Baz,就這么簡(jiǎn)單。
提倡不是用嵌套的擴(kuò)展。
擴(kuò)展標(biāo)簽數(shù)字的選擇:
message Foo {
extensions 1000 to max;
}
max
= 229 – 1, 或者 536,870,911.但是不包含19000~19999,具體原因參照上文。
9、 包
舉例:
package foo.bar;
message Open { … }
在另外一個(gè)message中使用這個(gè)包的方法:
message Foo {
…
required foo.bar.Open open = 1;
…
}
生成的C++代碼中package被聲明為命名空間。Open將在命名空間foo::bar中。
10、 服務(wù)的定義
舉例如下:
service SearchService {
rpc Search (SearchRequest) returns (SearchResponse);
}
11、 選項(xiàng)
。。。
12、 產(chǎn)生你的類
下載源碼,配置并編譯源碼生成編譯器。編譯參數(shù):
protoc –proto_path=IMPORT_PATH –cpp_out=DST_DIR –java_out=DST_DIR –python_out=DST_DIR path/to/file.proto
說(shuō)明:
a. LMPORT_PATH是指定你的.proto文件坐在的目錄。
b. 提供以下輸出:
–cpp_out在DST_DIR產(chǎn)生C++代碼
–java_out在DST_DIR產(chǎn)生Java代碼
–python_out在DST_DIR產(chǎn)生python代碼
c. 必須提供一個(gè)或者多個(gè).proto文件作為輸入。當(dāng)然多個(gè).proto文件可以同時(shí)被指定編譯。