linux和windows下使用protoc

NO IMAGE

protocol buffers和xml一樣在序列化資料結構時很靈活、高效和智慧,但是它的優勢在於定義檔案更小,讀取速度更快,使用更加簡單。目前protocol
buffers支援C 、java和python三種語言並且獨立於平臺。

linux環境安裝

下載protobuf-2.5.0.tar.gz

tar -xvf protobuf-2.5.0.tar.gz

./configure —prefix=/usr/local/protobuf-2.5.0

make

make install

安裝成功後可將編譯程式連結到系統bin目錄下,以免每次使用都加絕對路徑

ln -s /usr/local/protobuf-2.5.0/bin/protoc
/usr/bin/protoc

linux安裝完成!

 

使用步驟:

新建*.proto檔案,並呼叫命令:protoc
–cpp_out= *.proto編譯即可生成C 的.h和cpp檔案。

 

windows環境安裝

下載 protobuf-2.5.0.zip

解壓後使用VS開啟vsprojects目錄下的工程,編譯生成protoc.exe、libprotobuf.lib,將protoc.exe放到windows目錄下。

新建測試工程,連結libprotobuf.lib檔案。新建test.proto檔案,並在cmd控制檯下輸入命令即可生成標頭檔案和原始檔:

C:\Users\Administrator> protoc.exe -I=e:\protocbuf\include
–cpp_out=e:\protocbuf\include\ e:\protocbuf\include\test.proto

 

 

protocbuf 語法

定義示例

option optimize_for = SPEED;

enum UserType

{

    ORDINERY_USER = 0;    //普通使用者

    VIP_USER = 1;         //vip使用者

}

 

message UserList

{

        repeated User                     users                   =
1;

}

 

message User

{

        required int32                    uid                    =
1;

        optional int64                    guid                   =
2;

        optional byte                     nick                     =
3;

        optional string                   account                =
4;

        optional UserType               type                  =
5[default=1];

}

 

protocbuf 使用message表示資料結構,類似c語言中的struct。

 

優化級別介紹 

Protocol Buffer定義三種優化級別SPEED/CODE_SIZE/LITE_RUNTIME。預設情況下是SPEED。

    option optimize_for = SPEED;
    SPEED: 表示生成的程式碼執行效率高,但是由此生成的程式碼編譯後會佔用更多的空間。

    CODE_SIZE: 和SPEED恰恰相反,程式碼執行效率較低,但是由此生成的程式碼編譯後會佔用更少的空間,通常用於資源有限的平臺,如Mobile。
    LITE_RUNTIME: 生成的程式碼執行效率高,同時生成程式碼編譯後的所佔用的空間也是非常少。這是以犧牲Protocol Buffer提供的反射功能為代價的。

 

編譯介紹

protoc –proto_path=IMPORT_PATH –cpp_out=DST_DIR
–java_out=DST_DIR –python_out=DST_DIR path/to/file.proto–proto_path=IMPORT_PATH –cpp_out=DST_DIR –java_out=DST_DIR
–python_out=DST_DIR path/to/file.prot

 升級原則

    在實際的開發中會存在這樣一種應用場景,既訊息格式因為某些需求的變化而不得不進行必要的升級,但是有些使用原有訊息格式的應用程式暫時又不能被立刻升級,這便要求我們在升級訊息格式時要遵守一定的規則,從而可以保證基於新老訊息格式的新老程式同時執行。規則如下:
1. 不要修改已經存在欄位的標籤號。
2. 任何新新增的欄位必須是optional和repeated限定符,否則無法保證新老程式在互相傳遞訊息時的訊息相容性。
3. 在原有的訊息中,不能移除已經存在的required欄位,optional和repeated型別的欄位可以被移除,但是他們之前使用的標籤號必須被保留,不能被新的欄位重用。
4. int32、uint32、int64、uint64和bool等型別之間是相容的,sint32和sint64是相容的,string和bytes是相容的,fixed32和sfixed32,以及fixed64和sfixed64之間是相容的,這意味著如果想修改原有欄位的型別時,為了保證相容性,只能將其修改為與其原有型別相容的型別,否則就將打破新老訊息格式的相容性。
5. optional和repeated限定符也是相互相容的