Google Protobuf開發指南 html
l 它是開源項目:http://code.google.com/p/protobuf/ c++
l 由google開發,而且在google內部使用 shell
l Protobuf的做用和xml、json是一回事,但他是二進制格式,性能好、效率高。 json
l 代碼生成機制 vim
l 支持多種語言 網絡
l 向後兼容、向前兼容 函數
l 缺點:可讀性、靈活性 性能
下載最新的protobuf-2.5.0.zip
解壓後:測試
其中「editor」包含vim和emacs的語法高亮配置文件,」examples」是一個例子,vsprojects文件夾是visual studio的項目文件,src中是c++的源文件。 ui
1. 編譯lib文件
2. 在項目中引入include和lib文件夾
3. 開始使用
http://blog.sina.com.cn/s/blog_56dee71a01015i13.html
Protobuf在TCP中使用注意事項
個人測試程序使用的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
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; }
注:每一個值末尾使用分號而不是逗號