protocolbuffer技术详解(语言规范)

protocolbuffer技术详解(语言规范)

ID:22047575

大小:119.17 KB

页数:9页

时间:2018-10-26

protocolbuffer技术详解(语言规范)_第1页
protocolbuffer技术详解(语言规范)_第2页
protocolbuffer技术详解(语言规范)_第3页
protocolbuffer技术详解(语言规范)_第4页
protocolbuffer技术详解(语言规范)_第5页
资源描述:

《protocolbuffer技术详解(语言规范)》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、内容主体主要源自于ProtocolBuffer的官方文档,而代码示例则抽取于一个公司内部项口的Demo。这样做不仅可以保持Google文档的&好风格和系统性,同吋再结合一些比较实用和通用的用例,这样就更加便于公司内部的培训,以及和广大网友的技术交流。需要说明的是,Blog的内容并非linebyline的翻译,其中包含一些经验性总结,与此同时,对于一些不是非常常用的功能并未予以说明,有兴趣的开发者可以直接查阅Google的官方文档。—、为什么使用ProtocolBuffer?在回答这个问题之前,我们还是先给出一个在实际开发中经常会遇到的系统场景。比如:我们

2、的客户端程序是使用Java开发的,可能运行自不同的平台,如:Linux、Windows或者是Android,而我们的服务器程序通常是基于Linux平台并使用C++开发完成的。在这两种程序之间进行数据通讯吋存在多种方式用于设计消息格式,如:1.直接传递C/C++语言中一字节对齐的结构体数据,只要结构体的声明为定长格式,那么该方式对于C/C++程序而言就非常方便了,仅需将接收到的数据按照结构体类型强行转换即可。事实上对于变长结构体也不会非常麻烦。在发送数据吋,也只需定义一个结构体变量并设置各个成员变量的值之后,再以chat-的方式将该二进制数据发送到远端。反

3、之,该方式对于Java开发者而言就会非常繁琐,首先需要将接收到的数据存于ByteBuffer之中,再根据约定的字节序逐个读取毎个字段,并将读取后的值再赋值给另外一个值对象中的域变量,以便于程序中其他代码逻辑的编写。对于该类型程序而言,联调的基准是必须客户端和服务器双方均完成了消息报文构建程序的编写后才能展开,而该设计方式将会直接导致Java程序开发的进度过慢。即便是Debug阶段,也会经常遇到Java程序中出现各种域字段拼接的小错误。2.使用SOAP协议(WebService)作为消息报文的格式载体,由该方式生成的报文是基于文本格式的,同时还存在大量的X

4、ML描述信息,因此将会大大增加网络I0的负担。又由于XML解析的复杂性,这也会大幅降低报文解析的性能。总之,使用该设计方式将会使系统的整体运行性能明显下降。对于以上两种方式所产生的问题,ProtocolBuffer均可以很好的解决,不仅如此,ProtocolBuffer还有一个非常重要的优点就是可以保证同一消息报文新旧版本之间的兼容性。至于具体的方式我们将会在后续的博客中给出。二、定义第一个ProtocolBuffer消息。创建扩展名为.proto的文件,如:MyMessage.proto,并将以下内容存入该文件中。messageLogonReqMess

5、age{requiredint64acct/D=1;requiredstringpasswd=2}这里将给出以上消息定义的关键性说明。1.message是消息定义的关键字,等同于C++中的struct/class,或是Java中的class。2.LogonReqMessage为消息的名字,等同于结构体名或类名。3.required前缀表示该字段为必要字段,既在序列化和反序列化之前该字段必须已经被赋值。与此向时,在ProtocolBuffer中还存在另外两个类似的关键字,optional和repeated,带有这两种限定符的消息字段则没存required字

6、段这样的限制。相比于optional,repeated主要用于表示数组字段。具体的使用方式在后面的用例中均会一一列出。4.int64和string分别表示长整型和字符串型的消息字段,在ProtocolBuffer中存在一张类型对照表,即ProtocolBuffer中的数据类型与其他编程语言(C++/Java)中所用类型的对照。该对照表中还将给出在不同的数裾场景下,哪种类型更为高效。该对照表将在后面给出。5.acctID和passwd分别表示消息字段名,等同于Java中的域变量名,或是C++屮的成员变量名。6.标签数字1和2则表示不同的字段在序列化后的二进

7、制数据中的布局位置。在该例中,passwd字段编码后的数据一定位于acctID之后。需要注意的是该值在同一message巾不能重复。另外,对于ProtocolBuffer而言,标签值为1到15的字段在编码时可以得到优化,即标签值和类型信息仅占有一个byte,标签范围是16到2047的将占有两个bytes,而ProtocolBuffer可以支持的字段数量则为2的29次方减一。有鉴于此,我们在设计消息结构时,可以尽可能考虑让repeated类型的字段标签位于1到15之间,这样便可以有效的节省编码后的字节数量。三、定义第二个(含有枚举字段)ProtocolBu

8、ffer消息。//在定义ProtocolBuffer的消息时,可以使用和C++/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。