protobuf 語法簡介

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

關於這個數字標籤也是有說明的,115是隻使用一個字節編號,而其餘的使用多個字節,因此應把1-15編號給最常用的域。數字標籤的最大值爲2^29 - 1(或536,870,911),其中還有一段是保留用於proto的實現,從1900019999(FieldDescriptor::kFirstReservedNumberFieldDescriptor::kLastReservedNumber)orm

有optional說明的域能夠有一個默認值,在不指定該域時使用,如optional PhoneType type = 2 [default = HOME];

還有一種類型是enum,如上enum PhoneType的定義。類型能夠定義在一個message類型中,也能夠單獨定義,如上enum PhoneTypemessage 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分別是生成javapython代碼的路徑;path/file.proto是定義結構的.proto文件。

使用c++語言,會生成針對每一個message類型的一個類,對每個類也提供了相應的處理方法,還提供了序列化到輸出流和從輸入流中解析的方法。

原文

http://blog.itpub.net/post/42700/527047

http://www.cnblogs.com/mydomain/p/3176373.html

相關文章
相關標籤/搜索