Google Protobuf 开发指南
為什么80%的碼農都做不了架構師?>>> ??
Google Protobuf開發指南
1.簡介
l? 它是開源項目:http://code.google.com/p/protobuf/
l? 由google開發,并且在google內部使用
l? Protobuf的作用和xml、json是一回事,但他是二進制格式,性能好、效率高。
l? 代碼生成機制
l? 支持多種語言
l? 向后兼容、向前兼容
l? 缺點:可讀性、靈活性
2.protobuf目錄結構
下載最新的protobuf-2.5.0.zip
解壓后:
其中“editor”包含vim和emacs的語法高亮配置文件,”examples”是一個例子,vsprojects文件夾是visual studio的項目文件,src中是c++的源文件。
3.使用步驟
1.?????? 編譯lib文件
2.?????? 在項目中引入include和lib文件夾
3.?????? 開始使用
4.AddressBook例子
http://blog.sina.com.cn/s/blog_56dee71a01015i13.html
5.protobuf在網絡通信中應用
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?
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; }注:每個值末尾使用分號而不是逗號
?
轉載于:https://my.oschina.net/macwe/blog/157862
總結
以上是生活随笔為你收集整理的Google Protobuf 开发指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 认识oracle监听器配置文件
- 下一篇: 学习bash的一些零碎知识总结(二)