今天在做java報表時 無意間浏覽了一個block 發現了一個好東西就是Google +protobuf ,真心感覺在Socket 項目中自定義協議時,確實有些問題。第 一是效率的問題,第二是性能上存在問題。
先來介紹一下 protobuf :
protobuf是一個開源項目官方站點在“這裡 ”),而且是後台很硬的開源項目
它是鼎鼎大名的Google公司開發出來,並且在Google內部久經考驗的一個東東。由此可見,它的作者絕非一般閒雜人等可比.
它的作用 :
它的功能和XML 的功能基本相似,懂XML的都知道 就是把某種數據結構的信息,以某種格式保存起來。主要用於數據存儲、傳輸協議格式等場合。
他和XML 的區別:
你就會納悶了,用XML 不就行了,其實不然。XML 跟它 相比還是有點不足之處的,他的缺點主要在XML的序列化和煩序列化上,在序列化上當存在大量冗余數據時,效率,開銷就不是客觀了,在反序列化上開銷挺大的。
下面的舉例 來自網絡上的一位大神。
代碼生成機制
除了性能好,代碼生成機制是主要吸引俺的地方。為了說明這個代碼生成機制,俺舉個例子。
比如有個電子商務的系統假設用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;
}
--------------------------------
有了這種代碼生成機制,開發人員再也不用吭哧吭哧地編寫那些協議解析的代碼了干這種活是典型的吃力不討好)。
同樣在上次的項目中也可以利用它,封裝自定義的協議,就可以避免編寫協議解析的代碼了。
最後我再補充一下,他是有Google 開發 不久交給開源社區。他的性能不必懷疑。同時他支持 C++ java Paython (官方) 不久有了各種語言的,有民間大神 開發效率,性能 相比可想而知了)
本文出自 “隨筆” 博客,請務必保留此出處http://bigmac.blog.51cto.com/4126355/1270745