Google Protobuf 開發指南

Google Protobuf開發指南 html

1.簡介

它是開源項目:http://code.google.com/p/protobuf/ c++

google開發,而且在google內部使用 shell

Protobuf的做用和xmljson是一回事,但他是二進制格式,性能好、效率高。 json

代碼生成機制 vim

支持多種語言 網絡

向後兼容、向前兼容 函數

缺點:可讀性、靈活性 性能

2.protobuf目錄結構

下載最新的protobuf-2.5.0.zip
解壓後:測試

其中「editor」包含vimemacs的語法高亮配置文件,」examples」是一個例子,vsprojects文件夾是visual studio的項目文件,src中是c++的源文件。 ui

3.使用步驟

1.       編譯lib文件

2.       在項目中引入includelib文件夾

3.       開始使用

4.AddressBook例子

http://blog.sina.com.cn/s/blog_56dee71a01015i13.html

5.protobuf在網絡通訊中應用

ProtobufTCP中使用注意事項
個人測試程序使用的TCP,因而一個很天然的問題,報文的邊界或者報文長度問題,在網上google了一圈以後發現這個確實是個問題,解決問題的方案也很直接,在報文前面加上一個字段表示整個報文的長度(包括加上的字段)。


bool SerializeToArray(void * data, int size) const

bool SerializeToString(string * output) const

固然還有一些其餘變種,我不喜歡使用stl string,因此選用了SerializeToArray

 

能夠使用一下API反序列化:

boolParseFromArray(const void * data, int size)

boolParseFromString(const string & data)

以上寫着函數都定義在  google/protobuf/message_lite.h 中


不過這裏有更好的解決方法:

來自陳碩的文章《一種自動反射消息類型的 Google Protobuf 網絡傳輸方案

http://www.cnblogs.com/Solstice/archive/2011/04/03/2004458.html 

6.".proto"文件語法

Proto文件

例子:

package tutorial;
 
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
 
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
 
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
 
  repeated PhoneNumber phone = 4;
}
 
message AddressBook {
  repeated Person person = 1;
}


1.        字段類型:bool,int32,float,double,string

2.        支持消息嵌套

3.        支持enum

索引號要按順序指定

字段前綴:

required:必須的

optional:可選的

repeated:能夠重複的

 

protoc使用

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto

代碼使用說明:

在程序開頭添加:

// Verify that the version of the library that we linked against is   
// compatible with the version of the headers we compiled against.   
GOOGLE_PROTOBUF_VERIFY_VERSION;

在程序結尾添加:

// Optional:  Delete all global objects allocated by libprotobuf.   
google::protobuf::ShutdownProtobufLibrary();

 

代碼風格指導

https://developers.google.com/protocol-buffers/docs/style

1.       消息和字段名:大寫字母開頭的駝峯表示法表示消息名稱,如:SongServerRequest。使用小寫字母+下劃線分隔表示字段名,如:song_name

message SongServerRequest {
  required string song_name = 1;
}

2.       枚舉類型:大寫字母開頭的駝峯表示法表示枚舉名稱,使用大寫字母+下劃線表示值

enum Foo {
  FIRST_VALUE = 1;
  SECOND_VALUE = 2;
}


:每一個值末尾使用分號而不是逗號

相關文章
相關標籤/搜索