}
只是用了大括號進行括起來,注意標點!這個和上面的那個例子是一致的。
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文件可以同時被指定編譯。