Google的开源技术protobuf概述

一、作用

protobuf(Protocol Buffers)是Google内部使用的一个项目,后来贡献给开源社区为大家使用。它要做的事情和xml类似,就是要把某种数据结构的信息有某种格式保存起来,主要用于数据存储、传输协议格式等场合。

二、优点

和xml有着类似的功能,那么肯定有一些更加优势的地方。

1、时间开销

xml格式化(序列化)的开销还可以,但是xml解析(反序列化)的开销较大。相比protobuf的时间开销要小一些;

2、空间开销

为了提高可读性xml中引入了一些冗余的文本信息,空间开销加大。相比protobuf的空间开销要小一些;

3、开发调用简单

只需使用message定义消息结构,在发送方使用set方法发送消息,在接收方使用调用方法接收消息即可。省去了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;

}

--------------------------------

4、代码灵活,降低模块间的耦合性

A和B两个模块相互通信,当其中一个模块或消息格式发生改变时,只需改动一点代码即可。

5、支持多种编程语言

Google发布的源码中包括C++、Java、Python三种语言,现在可以支持ActionScript、C#、Lisp、Erlang、Perl、PHP、Ruby等。而且Protobuf支持通信的双方使用不同的语言开发。

三、缺点

1、代码可读性差

Protobuf使用二进制格式进行编码,如果通信双方有一方出现了问题,二进制的消息很难被读懂,很难对错误定位。虽然Protobuf提供了TextFormat工具类,但是也不能彻底解决问题,未解决问题可以直接抓包并dump成log以定位错误。

2、缺乏自描述

没有自描述信息,二进制的格式很难被看懂,需配合Proto文件。

四、Protobuf的使用及实例

1 下载安装

(1)下载

需要两个包,protobuf-2.5.0.tar.gz,protoc-2.5.0-win32.zip。

本来可以到https://code.google.com/p/protobuf/downloads/list下载,不过被墙了。

可以移步到这里下载:http://download.csdn.net/detail/erli11/7408633

下载相同版本供java使用的protobuf-java-2.5.0.jar:

http://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/2.5.0/protobuf-java-2.5.0.jar

2demo展示

(1)创建proto文件

在protoc-2.5.0-win32目录(包含protoc.ext可执行文件),创建msg.proto

[plain] view plaincopy

  1. package discover;
  2. option java_package = "com.sg.discover";
  3. option java_outer_classname = "SocialRecommend";
  4. message RecommendInfo  {
  5. optional string hid = 1;
  6. optional string tags = 2;
  7. repeated TopicInfo topicList = 3;
  8. }
  9. message TopicInfo  {
  10. optional string name = 1;
  11. optional string type = 2;
  12. repeated string entities = 3;
  13. repeated string tags = 4;
  14. }

(2)使用如下命令编译proto文件,生成对应Java代码

注:编译成功无消息输出,会产生文件;

./ 与 msg.proto中间有空格

(3)序列化

[java] view plaincopy

  1. private SocialRecommend.RecommendInfo transRecommendInfoToPB(RecommendBean recommendInfo) {
  2. SocialRecommend.RecommendInfo.Builder builder =
  3. SocialRecommend.RecommendInfo.newBuilder();
  4. builder.setHid(recommendInfo.hid);
  5. builder.setTags(recommendInfo.tags);
  6. for(int i = 0; i< recommendInfo.topicList.size(); i++){
  7. TopicInfo topicInfo = recommendInfo.topicList.get(i);
  8. SocialRecommend.TopicInfo kvTopic = trasnTopicInfoToPB(topicInfo);
  9. builder.addTopicList(kvTopic);
  10. }
  11. return builder.build();
  12. }

[java] view plaincopy

  1. byte[] pbByteArray = pb.toByteArray();

(4)反序列化

[java] view plaincopy

  1. SocialRecommend.RecommendInfo msg = SocialRecommend.RecommendInfo.parseFrom(pbByteArray);
  2. System.out.println(msg);

参考http://blog.csdn.net/program_think/article/details/4229773

http://blog.csdn.net/erli11/article/details/27213239

时间: 2024-07-28 14:55:19

Google的开源技术protobuf概述的相关文章

Google 的开源技术protobuf 简介与例子[转]

来源:http://blog.csdn.net/caisini_vc/article/details/5599468 今天来介绍一下"Protocol Buffers "(以下简称protobuf)这个玩意儿.本来俺在构思"生产者/消费者模式 "系列的下一个帖子:关于生产者和消费者之间的数据传输格式.由于里面扯到了protobuf,想想干脆单独开一个帖子算了. ★protobuf是啥玩意儿? 为了照顾从没听说过的同学,照例先来扫盲一把. 首先,protobuf是一个

Google 的开源技术protobuf 简介与例子

来介绍一下“Protocol Buffers ”(以下简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的数据传输格式.由于里面扯到了protobuf,想想干脆单独开一个帖子算了. ★protobuf是啥玩意儿? 为了照顾从没听说过的同学,照例先来扫盲一把. 首先,protobuf是一个开源 项 目(官方站点在“这里 ”),而且是后台很硬的开源项目.网上现有的大部分(至少80%)开源项目,要么是某人单干.要么是几个闲杂人等合伙搞.而pr

Google 开源技术protobuf

http://blog.csdn.net/hguisu/article/details/20721109#0-tsina-1-1601-397232819ff9a47a7b7e80a40613cfe1 1.  Protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML 表示高效短小得多.虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行

Google开源技术protobuf

1.protobuf简介 protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持PHP.Java.c++.Python等语言环境.通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作. protobuf在google

百度和 Google 的搜索技术是一个量级吗?

著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Kenny Chao 链接:http://www.zhihu.com/question/22447908/answer/21435705 来源:知乎 很多答案是从使用上讲的,我加两个技术方面的. 搜索引擎需要对抓取到的结果进行管理.当索引结果越来越多时,保证存储和查询速度,保证数万台服务器内容一致的难度越来越高.Google于03至06年左右公布了三篇论文,描述了GFS.BigTable.MapReduce三种技术以解

为什么计算机的学生要学习 Linux 开源技术

by falcon of TinyLab.org 2013/08/25 Linux开源相关技术对于学生来说,特别是计算机专业的学生来说,非常重要,下面就几个方面进行讨论: 研究平台 因为开源的优势,有非常多的开放的文案可以参考,有很多有趣的点子可以拿来做深入的研究.任何一个点挖进去都是一片天地. 专业视野 通过那些开放的项目,你可以通过邮件列表.Linkedin.Google Group接触到来自全球各地的天才,不仅可以提升英文读写能力,认识国际友人,还可以把握领域前沿,甚至还有机会得到大佬们的

【方案】去哪儿网徐磊:如何利用开源技术构建日处理130亿+的实时日志平台?

转自:http://mp.weixin.qq.com/s?__biz=MzIzMzEzODYwOA==&mid=2665284466&idx=1&sn=2b06a529821734e36e26e642424f24fc&scene=2&srcid=0527p3qISp6dFqGg8iLIYgRF&from=timeline&isappinstalled=0#wechat_redirect [本文系互联网技术联盟(ITA1024)原创首发,转载或节选内容

Google FlatBuffers——开源、跨平台的新一代序列化工具

前段时间刚试用了一个序列化工具cereal,请看cereal:C++实现的开源序列化库,打算再总结下我对google proto buf序列化库的使用呢, 结果还没动手,大Google又出了一个新的.开源.跨平台的序列化工具:FlatBuffers.那就索性先了解了解这个工具把. 一. 什么是Google FlatBuffers FlatBuffers是一个开源的.跨平台的.高效的.提供了C++/Java接口的序列化工具库.它是Google专门为游戏开发或其他性能敏感的应用程序需求而创建.尤其更

感知开源的力量-APICloud Studio开源技术分享会

2014.9.15 中国领先的"云端一体"移动应用云服务提供商APICloud正式发布 2015.9.15,APICloud上线一周年,迎来第一个生日 这一天,APICloud 举办APICloud Studio开源技术分享会 我们将对APICloud Studio进行技术开源的全面解析, APICloud Studio遵循Aptana3.0 GPL开源协议,源代码以无条件继承GPL开源协议的方式贡献给业界. 我们相信,通过开源技术分享,我们将和广大开发者一起,不断扩展主流HTML开发