青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

每天早晨叫醒你的不是鬧鐘,而是夢想

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  62 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 轉載自:Protocol Buffers Language Guide之proto文件類型格式分析[關鍵點翻譯] | 漂泊如風

今天來介紹一下“Protocol Buffers”(以下簡稱protobuf)這個玩意兒。

protobuf是啥玩意兒?
為了照顧從沒聽說過的同學,照例先來掃盲一把。
首先,protobuf是一個開源項目(官方站點在“這里 ”),而且是后臺很硬的開源項目。網上現有的大部分(至少80%)開源項目,要么是某人單干、要么是幾個閑雜人等合伙搞。而protobuf則不然,它是 鼎鼎大名的Google公司開發出來,并且在Google內部久經考驗的一個東東。由此可見,它的作者絕非一般閑雜人等可比。
那這個聽起來牛X的東東到底有啥用處捏?簡單地說,這個東東干的事兒其實和XML差不多,也就是把某種數據結構的信息,以某種格式保存起來。主要用于數據存儲、傳輸協議格式等 場合。有同學可能心理犯嘀咕了:放著好好的XML不用,干嘛重新發明輪子啊?!先別急,后面俺自然會有說道。
話說到了去年(大約是08年7 月),Google突然大發慈悲,把這個好東西貢獻給了開源社區。這下,像俺這種喜歡撿現成的家伙可就有福啦!貌似喜歡撿現成的家伙還蠻多滴,再加上 Google的號召力,開源后不到一年,protobuf的人氣就已經很旺了。所以俺為了與時俱進,就單獨開個帖子來忽悠一把。

protobuf有啥特色?
掃盲完了之后,就該聊一下技術方面的話題了。由于這玩意兒發布的時間較短(未滿周歲),所以俺接觸的時間也不長。今天在此是先學現賣,列位看官多多包涵 :-)

◇性能好/效率高
現在,俺就來說說Google公司為啥放著好端端的XML不用,非要另起爐灶,重新造輪子。一個根本的原因是XML性能不夠好。
先說時間開銷:XML格式化(序列化)的開銷倒還好;但是XML解析(反序列化)的開銷就不敢恭維啦。俺之前經常碰到一些時間性能很敏感的場合,由于不堪忍受XML解析的速度,棄之如敝履。
再來看空間開銷:熟悉XML語法的同學應該知道,XML格式為了有較好的可讀性,引入了一些冗余的文本信息。所以空間開銷也不是太好(不過這點缺點,俺不常碰到)。
由于Google公司賴以吹噓的就是它的海量數據和海量處理能力。對于幾十萬、上百萬機器的集群,動不動就是PB級的數據量,哪怕性能稍微提高0.1% 也是相當可觀滴。所以Google自然無法容忍XML在性能上的明顯缺點。再加上Google從來就不缺造輪子的牛人,所以protobuf也就應運而生 了。
Google對于性能的偏執,那可是出了名的。所以,俺對于Google搞出來protobuf是非常滴放心,性能上不敢說是最好,但肯定不會太差。

◇代碼生成機制
除了性能好,代碼生成機制是主要吸引俺的地方。為了說明這個代碼生成機制,俺舉個例子。
比如有個電子商務的系統(假設用C++實現),其中的模塊A需要發送大量的訂單信息給模塊B,通訊的方式使用socket。
假設訂單包括如下屬性:
--------------------------------
時間:time(用整數表示)
客戶id:userid(用整數表示)
交易金額:price(用浮點數表示)
交易的描述:desc(用字符串表示)
--------------------------------
如果使用protobuf實現,首先要寫一個proto文件(不妨叫Order.proto),在該文件中添加一個名為”Order”的message結構,用來描述通訊協議中的結構化數據。該文件的內容大致如下:
--------------------------------
message Order
{
required int32 time = 1;
required int32 userid = 2;
required float price = 3;
optional string desc = 4;
}
--------------------------------

然后,使用protobuf內置的編譯器編譯 該proto。由于本例子的模塊是C++,你可以通過protobuf編譯器的命令行參數(看“這里 ”),指定它生成C++語言的“訂單包裝類”。(一般來說,一個message結構會生成一個包裝類)
然后你使用類似下面的代碼來序列化/解析該訂單包裝類:
--------------------------------

// 發送方
Order order;
order.set_time(XXXX);
order.set_userid(123);
order.set_price(100.0f);
order.set_desc(“a test order”);

string sOrder;
order.SerailzeToString(&sOrder);
// 然后調用某種socket的通訊庫把序列化之后的字符串發送出去
// ……

--------------------------------
// 接收方
string sOrder;
// 先通過網絡通訊庫接收到數據,存放到某字符串sOrder
// ……

Order order;
if(order.ParseFromString(sOrder)) // 解析該字符串
{
cout << “userid:” << order.userid() << endl
<< “desc:” << order.desc() << endl;
}
else
{
cerr << “parse error!” << endl;
}
--------------------------------

有了這種代碼生成機制,開發人員再也不用吭哧吭哧地編寫那些協議解析的代碼了(干這種活是典型的吃力不討好)。
萬一將來需求發生變更,要求給訂單再增加一個“狀態”的屬性,那只需要在Order.proto文件中增加一行代碼。對于發送方(模塊A),只要增加一行設置狀態的代碼;對于接收方(模塊B)只要增加一行讀取狀態的代碼。哇塞,簡直太輕松了!
另外,如果通訊雙方使用不同的編程語言來實現,使用這種機制可以有效確保兩邊的模塊對于協議的處理是一致的。
順便跑題一下。
從某種意義上講,可以把proto文件看成是描述通訊協議的規格說明書(或者叫接口規范)。這種伎倆其實老早就有了,搞過微軟的COM編程或者接觸過CORBA的同學,應該都能從中看到IDL(詳細解釋看“這里 ”)的影子。它們的思想是相通滴。

◇支持“向后兼容”和“向前兼容”
還是拿剛才的例子來說事兒。為了敘述方便,俺把增加了“狀態”屬性的訂單協議成為“新版本”;之前的叫“老版本”。
所謂的“向后兼容”(backward compatible),就是說,當模塊B升級了之后,它能夠正確識別模塊A發出的老版本的協議。由于老版本沒有“狀態”這個屬性,在擴充協議時,可以考慮把“狀態”屬性設置成非必填 的,或者給“狀態”屬性設置一個缺省值(如何設置缺省值,參見“這里 ”)。
所謂的“向前兼容”(forward compatible),就是說,當模塊A升級了之后,模塊B能夠正常識別模塊A發出的新版本的協議。這時候,新增加的“狀態”屬性會被忽略。
“向后兼容”和“向前兼容”有啥用捏?俺舉個例子:當你維護一個很龐大的分布式系統時,由于你無法同時 升級所有 模塊,為了保證在升級過程中,整個系統能夠盡可能不受影響,就需要盡量保證通訊協議的“向后兼容”或“向前兼容”。

◇支持多種編程語言
俺開博以來點評的幾個開源項目(比如“Sqlite ”、“cURL ”),都是支持很多種 編程語言滴,這次的protobuf也不例外。在Google官方發布的源代碼中包含了C++、Java、Python三種語言(正好也是俺最常用的三種,真爽)。如果你平時用的就是這三種語言之一,那就好辦了。
假如你想把protobuf用于其它語言,咋辦捏?由于Google一呼百應的號召力,開源社區對protobuf響應踴躍,近期冒出很多其它編程語言 的版本(比如ActionScript、C#、Lisp、Erlang、Perl、PHP、Ruby等),有些語言還同時搞出了多個開源的項目。具體細節可以參見“這里 ”。
不過俺有義務提醒一下在座的各位同學。如果你考慮把protobuf用于上述這些語言,一定認真評估對應的開源庫。因為這些開源庫不是Google官方提供的、而且出來的時間還不長。所以,它們的質量、性能等方面可能還有欠缺。

protobuf有啥缺陷?
前幾天剛剛在“光環效應 ”的帖子里強調了“要同時評估優點和缺點”。所以俺最后再來批判一下這玩意兒的缺點。
◇應用不夠廣
由于protobuf剛公布沒多久,相比XML而言,protobuf還屬于初出茅廬。因此,在知名度、應用廣度等方面都遠不如XML。由于這個原因,假如你設計的系統需要提供若干對外的接口給第三方系統調用,俺奉勸你暫時不要考慮protobuf格式。
◇二進制格式導致可讀性差
為了提高性能,protobuf采用了二進制格式進行編碼。這直接導致了可讀性差的問題(嚴格地說,是沒有可讀性)。雖然protobuf提供了TextFormat這個工具類(文檔在“這里 ”),但終究無法徹底解決此問題。
可讀性差的危害,俺再來舉個例子。比如通訊雙方如果出現問題,極易導致扯皮(都不承認自己有問題,都說是對方的錯)。俺對付扯皮的一個簡單方法就是直接 抓包并dump成log,能比較容易地看出錯誤在哪一方。但是protobuf的二進制格式,導致你抓包并直接dump出來的log難以看懂。
◇缺乏自描述
一般來說,XML是自描述的,而protobuf格式則不是。給你一段二進制格式的協議內容,如果不配合相應的proto文件,那簡直就像天書一般。
由于“缺乏自描述”,再加上“二進制格式導致可讀性差”。所以在配置文件方面,protobuf是肯定無法取代XML的地位滴。

posted on 2011-04-05 18:26 沛沛 閱讀(351) 評論(0)  編輯 收藏 引用 所屬分類: 開源庫
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中文精品视频| 久久精品成人一区二区三区| 欧美成人亚洲| 最近看过的日韩成人| 欧美成人免费va影院高清| 久久久福利视频| 亚洲成色精品| 亚洲国产精品成人综合| 蜜桃av一区二区三区| 亚洲国产综合91精品麻豆| 亚洲国语精品自产拍在线观看| 欧美国产在线观看| 亚洲专区国产精品| 久久av一区二区| 亚洲人成网站在线观看播放| 99亚洲一区二区| 国产日韩在线一区| 欧美成人中文字幕在线| 欧美日韩国产va另类| 欧美一区二区大片| 老牛国产精品一区的观看方式| 99精品福利视频| 亚洲图片你懂的| 韩国精品在线观看| 亚洲另类视频| 国内精品嫩模av私拍在线观看 | 欧美视频免费在线| 欧美一区二区三区四区在线观看| 久久亚洲国产成人| 亚洲视频免费在线观看| 欧美在线视频免费播放| 亚洲视频一区二区免费在线观看| 亚洲欧美日产图| 亚洲精品一区二区三区福利| 午夜精品久久久久久久久久久久| 亚洲激情影院| 亚洲欧美乱综合| 亚洲色图自拍| 男女视频一区二区| 久久久久www| 国产精品免费看| 亚洲国产精品国自产拍av秋霞| 国产精品一区二区三区四区五区| 亚洲国产精品久久久久婷婷884| 国产在线视频不卡二| av72成人在线| 91久久久久| 久久久91精品国产| 欧美有码视频| 国产精品福利在线观看网址| 亚洲国产日韩一级| 激情五月综合色婷婷一区二区| 亚洲影院一区| 亚洲欧美在线一区| 欧美日韩亚洲一区二区三区四区| 久久全球大尺度高清视频| 国产欧美精品xxxx另类| 一区二区三区精品久久久| 亚洲视频精品| 欧美日韩一区二区三区免费看| 欧美大片在线观看一区| 一区二区在线视频播放| 久久国产精品久久国产精品| 欧美影院成年免费版| 国产精品手机视频| 亚洲无线视频| 先锋影音久久| 国产精品永久免费视频| 亚洲欧美日韩高清| 欧美在线免费一级片| 国产精品草莓在线免费观看| 一级日韩一区在线观看| 亚洲欧美视频在线| 国产精品五区| 欧美在线观看网站| 另类激情亚洲| 亚洲国产色一区| 欧美国产先锋| 亚洲人成毛片在线播放| 亚洲视频碰碰| 国产伦理一区| 久久久最新网址| 亚洲七七久久综合桃花剧情介绍| 日韩五码在线| 国产精品久久久久国产a级| 亚洲欧美高清| 久久一区中文字幕| 亚洲人妖在线| 国产精品久久久久久久电影| 午夜精品一区二区三区在线播放| 久久免费国产| 亚洲精品看片| 国产精品一区二区男女羞羞无遮挡| 亚洲欧美综合国产精品一区| 欧美不卡激情三级在线观看| 夜夜嗨av一区二区三区| 国产精品久久久久久一区二区三区| 亚洲欧美日韩中文视频| 久久在线免费| 一本到高清视频免费精品| 国产精品免费一区豆花| 久久精品国产99国产精品澳门| 亚洲国产成人在线视频| 午夜亚洲福利| 亚洲欧洲精品一区二区| 国产精品视频一区二区高潮| 免费日韩成人| 亚洲欧美日韩国产一区二区| 欧美激情国产日韩精品一区18| 一区二区三区波多野结衣在线观看| 国产精品国产三级国产普通话99 | 另类激情亚洲| 一二三区精品福利视频| 国产一区二区黄| 欧美精品亚洲| 久久久久久日产精品| 一区二区三区国产精品| 亚洲国产99| 久久亚洲私人国产精品va媚药| aa级大片欧美三级| 亚洲福利视频免费观看| 国产欧美一区视频| 欧美日韩亚洲一区二区三区在线观看| 久久久av网站| 午夜久久99| 在线亚洲观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲精品永久免费| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲男人的天堂在线| 亚洲毛片一区二区| 亚洲国产高清高潮精品美女| 国产在线不卡精品| 国产精品欧美一区二区三区奶水| 欧美精品一区二区三区视频| 欧美波霸影院| 免费日韩视频| 欧美成人一二三| 免费视频最近日韩| 久久一区视频| 美女脱光内衣内裤视频久久影院| 欧美专区日韩视频| 欧美伊人久久大香线蕉综合69| 亚洲综合第一页| 亚洲视频一起| 亚洲欧美一区二区精品久久久| 一区二区免费在线视频| 日韩午夜在线播放| 夜夜嗨av一区二区三区四季av| 亚洲精品视频在线观看网站 | 性久久久久久久久久久久| 亚洲综合色激情五月| 午夜精品久久久久久久99水蜜桃 | 亚洲视频免费在线| 亚洲视频一区二区在线观看| 亚洲色图自拍| 亚洲欧美区自拍先锋| 性8sex亚洲区入口| 久久国产精品亚洲va麻豆| 久久久精品国产99久久精品芒果| 久久国产99| 欧美www视频| 亚洲人成在线播放| 一本一本a久久| 亚洲欧美日韩精品久久久久| 欧美在线播放| 欧美福利一区| 欧美午夜久久久| 国产欧美三级| 亚洲高清资源| 亚洲一区制服诱惑| 久久久www免费人成黑人精品 | 亚洲国产美女| 一区二区三区四区五区精品视频| 亚洲综合社区| 免费成人小视频| 国产精品国产三级国产普通话99| 国产精品一区视频| 亚洲国产精品成人综合| 亚洲小视频在线观看| 久久综合成人精品亚洲另类欧美| 亚洲国产一区二区三区高清| 亚洲一区激情| 免费成人av| 国产区精品视频| 亚洲乱码久久| 久久成人精品视频| 亚洲精品日韩久久| 久久成人国产| 欧美三级午夜理伦三级中视频| 狠狠爱成人网| 校园春色综合网| 亚洲黄色一区| 久久久爽爽爽美女图片| 国产精品www| 亚洲精品在线视频| 可以看av的网站久久看| 亚洲一区自拍| 欧美日韩国产成人精品| 在线免费观看日本欧美|