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)只要增长一行读取状态的代码。哇塞,简直过轻松了!

相关文章
相关标签/搜索