- 浏览: 537998 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
landerson:
明显就有要求的嘛
ANDROID轻量级JSON序列化和反序列化[转] -
jimode2013:
很不错,就是需要这个方法
多个UIViewController使用addSubView,第二个 UIViewController 不响应旋转[转] -
w11h22j33:
...
[转]NSMutableArray中的自动释放对象让我郁闷了一整天 -
w11h22j33:
UILabel* label = [[UILabel a ...
Iphone开发 -
w11h22j33:
http://mobile.51cto.com/iphone- ...
获得通讯录中联系人的所有属性[转]
引自:http://blog.csdn.net/program_think/article/details/4229773
今天来介绍一下“Protocol Buffers”(以下简称protobuf)这个玩意儿。本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的数据传输格式。由于里面扯到了protobuf,想想干脆单独开一个帖子算了。 然后,使用protobuf内置的编译器编译 该proto。由于本例子的模块是C++,你可以通过protobuf编译器的命令行参数(看“这里 ”),指定它生成C++语言的“订单包装类”。(一般来说,一个message结构会生成一个包装类) 有了这种代码生成机制,开发人员再也不用吭哧吭哧地编写那些协议解析的代码了(干这种活是典型的吃力不讨好)。
★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;
}
--------------------------------
然后你使用类似下面的代码来序列化/解析该订单包装类:
--------------------------------
// 发送方
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的地位滴。
★为什么俺会用上protobuf?
俺自从前段时间接触了protobuf之后,就着手把俺负责的产品中的部分 数据传输协议替换成protobuf。可能有同学会问,和protobuf类似的东东也有不少,为啥独独相中protobuf捏?由于今天写的篇幅已经蛮长了,俺卖个关子,把这个话题留到“生产者/消费者模式[5]:如何选择传输协议及格式?”。俺会在后续的这个帖子里对比各种五花八门的协议格式,并谈谈俺的浅见。
发表评论
-
思考、学习新技术的原则和方式【转】
2014-01-02 17:50 1107http://kb.cnblogs.com/page/195 ... -
最好的程序员凡事先上谷歌搜索【转】
2013-03-07 18:07 1298我知道的最优秀的程序员是我的Framebase.io ... -
史上最最佳软件开发实践指导【转】
2013-03-07 18:06 1262“” 阅读器 软件开发 -
我所钟爱的代码审查【转】
2013-02-22 18:00 928当我从学术界转向产业界的过程中,对我生涯改变最大的事情就 ... -
高效代码审查的十个经验【转】
2013-02-22 17:59 976代码审查(Code Review)是软件开发中常用的手段,和 ... -
为什么程序员不擅长评估开发时间?[转]
2012-12-17 10:07 851一个曾经与我一起工作过的经验丰富的项目经理声称,他拿到程 ... -
给明年依然年轻的我们[转]
2012-06-28 09:18 931今天是22岁的最后一天。几个月前,我从沃顿商学院毕业,用 ... -
[转]用户交互设计UI参考书目整理
2012-01-19 15:18 1149书名 作者用户体验的要素 Jesse James Garret ... -
【转】android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
2011-09-07 18:23 2520protobuf 是什么? Protocol ... -
google ProtoBuf开发者指南【转】
2011-09-07 17:09 2504目录 1 概览 1.1 什么是 ... -
hg clone 命令的windows解决方法TortoiseHg[转]
2011-05-11 20:50 2330hg是跟svn和cvs一样的版本管理系统。windows下 ... -
谷歌高效能经理人的8个习惯【转】
2011-03-26 12:24 1199Google's "people operati ... -
面试时不要说的7件事【转】
2011-03-26 11:55 9857 Things Not to Say During ... -
为了成功 训练自己[转]
2011-03-26 11:50 1292你是否曾见过像曼尼· ... -
在github上建立自己的开源项目
2011-03-26 00:12 1988由于代码一直在自己这保存,一方面别人看不见,也不安全。搜了下, ... -
从ant到maven -- maven pom例子(初级)转
2011-02-27 00:46 1513http://hi.baidu.com/javajiwei/b ... -
从一个男人身上看出他的修养和抱负
2011-02-15 23:07 858一、拥有自信和风度 男人到了二十几岁后,就要开始学着用心去经营 ... -
用CVS来管理自己的程序
2011-01-15 18:18 906每个编写程序的人也许 ... -
手机操作系统三国时代的结束
2011-01-11 00:19 957第一篇:Symbian正式崩盘,手机操作系统三国时代结束 ... -
如何使用搜索技巧来成为一名高效的程序员
2011-01-11 00:05 840没有人是完全独立的孤 ...
相关推荐
Protocol Buffers是Google公司开发的开源数据编码方式,具有诸多优势。该技术可以应用于网管配置下发接口,实现高效、可靠的数据交换。下面是基于Protocol Buffers的配置下发接口适配与应用的知识点: 一、网管配置...
"前端开源库-protocol-buffers-schema" 这个标题表明我们讨论的是一个专注于前端开发的开源库,该库的核心功能是处理Protocol Buffers(简称protobuf)的模式定义。Protocol Buffers是一种高效的数据序列化协议,由...
Protocol Buffers(简称protobuf)是一种高效的数据序列化协议,由Google开发并开源,其设计理念是为了在各种数据结构间进行高效的通信和数据存储。它支持多种编程语言,包括C++, Java, Python等,而在这个场景下,...
Protocol Buffers (ProtocolBuffer/ protobuf )是... google大概是今天(08年7月8号)将其作为开源项目对外公布,说是后续还要开源的项目有不少都会用到Protocol Buffers。 标签:protobuf 数据序列化
**Protocol Buffers简介** Protocol Buffers(简称protobuf)是由Google开发的一种数据序列化协议,它类似于XML和JSON,但更加高效、紧凑。protobuf提供了一种结构化的数据存储和通信方式,使得不同语言之间可以...
谷歌协议缓冲区(Google Protocol Buffers,简称Protobuf)是一种由谷歌开发的数据序列化协议。它旨在以高效的二进制格式进行数据存储和传输,同时支持跨多种编程语言的数据交换。Protobuf的核心包含三大部分:一种...
"Protocol-Buffers-Swift-test" 是一个项目名称,表明这是一个关于使用 Protocol Buffers(谷歌的一种数据序列化协议)与 Swift 语言进行集成和测试的实践项目。"使用 Protocol Buffers 和 Swift 进行概念验证" 描述...
标题 "ProtocolBuffers 2.4.1.521" 指的是 Google 的 Protocol Buffers(简称 Protobuf)的一个特定版本,这是 Google 推出的一种数据序列化协议,类似于 XML 和 JSON,但更加高效、紧凑。这个版本是针对 C# 语言的...
Protocol Buffers(简称protobuf)是Google开发的一种高效、灵活的数据序列化协议,它允许开发者将结构化的数据序列化,便于存储、通信或者在各种数据处理系统之间交换数据。protobuf不仅独立于语言,还独立于平台,...
a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage
以下将详细介绍Protocol Buffers的相关知识点: ### Protocol Buffers简介 Protocol Buffers是一种语言中立、平台中立、可扩展的机制,用于序列化结构化的数据。它最初由Google开发,用于其内部通信需求,后开源并...
protobuf是Protocol Buffers的缩写,它是一种高效的数据序列化协议,由Google开发并开源。Protocol Buffers的设计目的是为了在各种数据结构之间进行高效的通信,包括网络通信、数据存储等场景。它支持多种编程语言,...
【Protocol Buffers简介】 Protocol Buffers(简称protobuf)是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后生成对应的序列化和反序列化的代码,用于在不同的编程语言之间进行高效的数据交换...
标题 "Go-goprotobuf-Go支持Google的protocolbuffers" 提到的是Go语言对Google的Protocol Buffers(protobuf)的支持。Protocol Buffers是一种数据序列化协议,它允许开发者定义数据结构,然后生成能够轻松地在各种...
- **gRPC**:Google 推出的一个高性能、开源的通用 RPC 框架,它基于 Protocol Buffers,支持多种语言。在 JavaScript 中,可以使用 `@grpc/grpc-js` 库实现 gRPC 客户端和服务端。 - **构建 gRPC 服务**:在 ....
生成器和actionscript库,用于在actionscript3(Flex / Flash / Air)项目中使用Google协议缓冲区。 该项目托管在@ http://code.google.com/p/protobuf-actionscript3/
Protocol Buffers是Google开源的一种数据序列化框架,用于结构化数据的编码和解码。相比XML,Protocol Buffers有以下优势: 1. **高效**:Protocol Buffers的编码结果通常比XML小得多,解析速度也更快,适合在网络...
描述中的"Release Protocol Buffers v3.0.0 路 google/protobuf 路 GitHub"指出这是Protocol Buffers的3.0.0版本,通常在GitHub上进行开源项目的管理和发布。这意味着用户可以从GitHub的google/protobuf仓库获取到更...
本系统采用C++技术栈,并结合 Docker、gRPC、Protocol Buffers等工具和框架的分布式Linux性能分析监控系统。通过模块化的设计,该项目旨在实现对分布式Linux 系统的性能监控和分析。.zip优质项目,资源经过严格测试...
protobuf-swift, 谷歌ProtocolBuffers的谷歌 用于Swift的协议缓冲器 Swift中协议缓冲区的实现。协议缓冲区是一种以高效但可扩展的格式编码结构化数据的方法。 这个项目是基于Google的协议缓冲区的实现。 有关更多...