protobuf 語法簡介html
1.基本語義java
在.proto文件中,最基本的數據類型爲message,如其定義所示,由message引導,以後是message類型的名字,以後是由{}包含的各個域(fields)。python
required string name = 1; 域字義的一個例子。c++
required 表示這個域是必需的dom
optional 該域選,出現0次或1次post
repeated 重複出現,0次或屢次ui
string是域的類型,但是簡單的標量類型(如bool,int32,float,double,string等),也但是複合類型(message,enum等)spa
name是域的名字,=1是給域一個數字標籤,這會影響到該域在二進制文件中順序。.net
關於這個數字標籤也是有說明的,1到15是隻使用一個字節編號,而其餘的使用多個字節,因此應把1-15編號給最常用的域。數字標籤的最大值爲2^29 - 1(或536,870,911),其中還有一段是保留用於proto的實現,從19000到19999(FieldDescriptor::kFirstReservedNumber到FieldDescriptor::kLastReservedNumber)。orm
有optional說明的域能夠有一個默認值,在不指定該域時使用,如optional PhoneType type = 2 [default = HOME];
還有一種類型是enum,如上enum PhoneType的定義。類型能夠定義在一個message類型中,也能夠單獨定義,如上enum PhoneType和message PhoneNumber是嵌套定義在message Person中,message AddressBook中單獨定義的。
能夠訪問一個嵌套定義在另外一個message類型中的message,但需使用域範圍標示,如同的c++裏使用另外一個命名空間的類:person::PhoneNumber。
添加註釋://
optional int32 page_number = 2;// Which page number do we want?
2.導入
導入:proto能夠導入在不一樣的文件中的定義。經過在文件頂端加入一個import語句
import "myproject/other_protos.proto";
3.擴展
擴展:proto支持將必定範圍內的數字編號做爲擴展時使用。
message Foo {
// ...
extensions 100 to 199;
}
extend Foo {
optional int32 bar = 126;
}
4.包
proto支持包的使用,以防止命名衝突。在文件的開始部分指定:package tutorial。不一樣的語言在生成代碼對包的處理是不一樣的:c++中做爲命名空間,java中也做包,python中是模塊。
options:可以使用option來指定一些選項,會對生成的代碼有一些影響。option分文件層的和域層的。在上面的例子中就使用了文件層的:
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
5.生成代碼:使用protoc編譯器就能夠生成相應語言的代碼。
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/file.proto
protoc.exe是編譯器的名字;--proto_path指定對導入文件的搜索路徑,若不指定,則爲當前路徑;--cpp_out指定生成c++文件的路徑,--java_out和 --python_out分別是生成java和python代碼的路徑;path/file.proto是定義結構的.proto文件。
使用c++語言,會生成針對每一個message類型的一個類,對每個類也提供了相應的處理方法,還提供了序列化到輸出流和從輸入流中解析的方法。
原文
http://blog.itpub.net/post/42700/527047
http://www.cnblogs.com/mydomain/p/3176373.html