protobuf

 韓夢飛沙  韓亞飛  313134555@qq.com  yue31313  han_meng_fei_sha算法

 

Protocol Buffers 」(簡稱protobuf)網絡

 

這個東東干的事兒其實和XML 差很少,也就是把某種數據結構的信息,以某種格式保存起來。主要用於數據存儲、傳輸協議格式等場合。數據結構

 

爲啥放着好端端的XML不用,非要另起爐竈,從新造輪子。一個根本的緣由是XML性能不夠好。
  先說時間開銷:XML格式化(序列化)的開銷倒還好;可是XML解析(反序列化)的開銷就不敢恭維啦。俺以前常常碰到一些時間性能很敏感的場合,因爲不堪忍受XML解析的速度,棄之如敝履。
  再來看空間開銷:熟悉XML語法的同窗應該知道,XML格式爲了有較好的可讀性,引入了一些冗餘的文本信息。因此空間開銷也不是太好(不過這點缺點,俺不常碰到)。
socket

 

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

 

--------------------------------性能

message Order
{
  required int32 time = 1;
  required int32 userid = 2;
  required float price = 3;
  optional string desc = 4;
}ui

--------------------------------spa

 


  而後,使用protobuf內置的編譯器編譯 該proto。因爲本例子的模塊是C++,你能夠經過protobuf編譯器的命令行參數(看「這裏 」),讓它生成C++語言的「訂單包裝類」。(通常來講,一個message結構會生成一個包裝類)
  而後你使用相似下面的代碼來序列化/解析該訂單包裝類:.net


--------------------------------命令行

// 發送方

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)只要增長一行讀取狀態的代碼。哇塞,簡直過輕鬆了!

相關文章
相關標籤/搜索