位置: 编程技术 - 正文

Protocol Buffers(Protobuf)开发者指南---概览

编辑:rootadmin


推荐整理分享Protocol Buffers(Protobuf)开发者指南---概览,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘、系统平台无关、可扩展的结构化数据序列化/反序列化工具,适用于通讯协议,数据存储等场合。

ps:为了方便拼写,下文的protobuf就是指protocol buffers。

本文档的面向读者是:希望使用protobuf的 Java、C++、Python的开发者。此概览将向您介绍如何开始使用protobuf,然后您可以跟着示例进行学习,或者深入了解protobuf的编码方式。API参考文档同样提供了此三种语言的版本,而且为了更好的编写.proto文件提供了语言指导、风格指导文档。

-------------------------------------------------------------------------------------小小的分割线----------------------------------------------------------------------------------------------------------

protobuf是什么?

protobuf 是一个灵活、高效,使用自动化机制的结构化数据序列工具,类似于XML,但比XML更小巧、更快、而且也更简单。只需要定义一次数据结构,你就可以使用代码生成器生成各种编程语言和各种流式文件的结构化读取和写入。甚至可以在无需重新编译部署新程序的情况下更新新的结构化数据。

他们是如何工作的?

你需要在protobuf信息文件内(.proto)指定你需要序列化的信息是什么样的结构。每个protubuf信息是一小段逻辑记录,包含一系列的“键--值”组合。这有一个定义了个人信息的protobuf信息文件例子!

如你所见,信息格式很简单,每个消息类型都有一个或多个唯一的字段,每个字段都有一个名字和值类型,值的类型可以是数字(整数或浮点数),逻辑值,字符串,字节,或者其他的自定义protobuf消息类型(就像上面的例子一样PhoneNubmer的PhoneType类型是自定的protobuf消息类型),允许您使用多层次的结构体,你可以指定optional(可选)、required(必须)、repeated(重复),需要更多的关于.proto信息文件的编写帮助请查看protobuf语言指南

Protocol Buffers(Protobuf)开发者指南---概览

一旦你定义了自己的消息格式(message),你就可以运行protobuf编译器,将你的 .proto 文件编译成特定语言的类。这些类提供了简单的方法访问每个字段(类似query() 和 set_query() ),就像访问类的方法一样将结构序列化或反序列化。例如你可以选择C++语言,运行编译如上的协议文件生成叫做Person的类 。随后你就可以在应用中使用这个类来序列化的读取信息。你可以这么写代码(此过程叫做序列化):

然后你可以这样读取已经序列化的信息(这个过程叫做反序列化):

你可以在不影响向后兼容的情况下随意给数据结构增加字段,旧有的数据会忽略新的字段。所以如果使用protobuf作为通信协议,你可以无须担心破坏现有代码的情况下扩展协议。

你可以在此找到完整的API参考 API Reference section, 关于Protobuf如何编码可以在此找到完整的文档Protocol Buffer Encoding.

为何不使用XML?

protobuf拥有比XML更多高级的序列化特点:

更简单 小3-倍 快-倍 更少的歧义 可以方便的生成数据存取类,易于使用例如,让我们看看如何在XML中建模Person的name和email字段:[html] view plaincopyprint?<person> <name>John Doe</name> <email>jdoe@example.com</email> </person> 对应的ProtocolBuffer报文则如下:此为protobuf的文本表示 这不是正常时使用的二进制数据[cpp] view plaincopyprint?person { name: "John Doe" email: "jdoe@example.com" } 当这个报文编码到protobuf的二进制格式时(上面的文本仅用于调试和编辑),它只需要字节和-ns的解析时间。而XML的版本需要字节(除去空白)和 -ns的解析时间。 当然,操作Protobuf也很简单:[cpp] view plaincopyprint?cout << "Name: " << person.name() << endl; cout << "E-mail: " << person.email() << endl; 而XML的你需要:[cpp] view plaincopyprint?cout << "Name: " << person.getElementsByTagName("name")->item(0)->innerText() << endl; cout << "E-mail: " << person.getElementsByTagName("email")->item(0)->innerText() << end; 当然,Protobuf并不是在任何时候都比XML更合适,例如Protobuf无法对一个基于标记文本的文档建模,因为你根本没法方便的在文本中插入结构。另外,XML是便于人类阅读和编辑的,而Protobuf则不是。还有XML是自解释的,而Protobuf仅在你拥有报文格式定义的 .proto 文件时才有意义。感觉这个解决方案很不错,非常适合我,应该如何开始呢?点击下载protobuf包 – 这包含了 Java、Python、C++的protobuf编译器源码,如何 生成你需要的IO类。构建和安装protobuf编译器,请查阅README的文档。一旦都准备好了的话,尝试跟随你选择的语言的指导例程,它将一步步的指导你如何使用protobuf构建应用程序!关于Protobuf的一点历史protobuf最初是在Google开发的,用以解决索引服务器的请求、响应协议。在使用ProtocolBuffer之前,有一种格式用以处理请求和响应数据的编码和解码,并且支持多种版本的协议。而这最终导致了丑陋的代码,例如: 通信协议因此变得越来越复杂,因为开发者必须确保,发出请求的人和接受请求的人必须同时兼容,并且在一方开始使用新协议时,另外一方也要可以接受。

Protobuf设计用于解决这一类问题:

很方便引入新字段,而中间服务器可以忽略这些字段,直接传递过去而无需理解所有的字段。格式可以自描述,并且可以在多种语言中使用(C++、Java等)

然而用户仍然需要手写解析代码。

随着系统的演化,他需要一些其他的功能:

自动生成编码和解码代码,而无需自己编写解析器。除了用于简短的RPC(Remote Procedure Call)请求,人们使用protobuf来做数据存储格式(例如BitTable)。RPC服务器接口可以作为 .proto 文件来描述,而通过protobuf的编译器生成存取(stub)类供用户实现服务器接口。

protobuf现在已经是Google的混合语言数据标准了,现在已经正在使用的有超过,种报文格式定义和超过 ,个 .proto 文件。他们用于RPC系统和持续数据存储系统。

原文地址:

python标准库之SocketServer 转载自:

Unity PlayerPrefs.DeleteAll 无效以及 PlayerPrefs文件保存位置 DeleteAll无效检查下设置的公司名称和项目名称是否是中午!!!!!改成英文即可各平台保存路径OnMacOSXPlayerPrefsarestoredin~/Library/Preferencesfolder,inafilenamedu

Unity架构?? 在Hierarchy界面中的切换,实质上触及了状态的切换,GameObject的activeself决定了component的函数调用,其底层应该是像状态机的原理,使用委托注册的方法控

标签: Protocol Buffers(Protobuf)开发者指南---概览

本文链接地址:https://www.jiuchutong.com/biancheng/383542.html 转载请保留说明!

上一篇:IOS为UNITY写插件/通信(unity iphone)

下一篇:python标准库之SocketServer(python标准库函数有哪些)

  • 增值税金税盘开票的结论
  • 财税2012年15号文件作废
  • 个人出租住房需要缴纳哪些税
  • 外购商品发给职工如何做账
  • 社保是当月计提当月的吗
  • 企业注销库存怎么做账
  • 暂估入账后没有交房产税
  • 没有报关单货物违法吗
  • 转租不动产需要预缴增值税吗
  • 出口货物是否属于存货
  • 已抵扣的进项税额红冲的账怎么做
  • 超市商品售出可以退货吗
  • 企业要怎样才能发挥其在实现生态产品价值过程中的作用
  • 收到认缴实收资本怎么做账务处理?
  • 企业利息收入要交所得税吗
  • 用实物资产注资给子公司需缴纳增值税吗?
  • 增值税纳税申报表在哪里打印
  • 福利费进项税额转出会计分录
  • 个人股权转让印花税在哪里申报
  • 自然人独资企业交什么税
  • windows10如何调出虚拟键盘
  • 领用原材料业务
  • 保险赔款确认函
  • 收到承兑汇票会计分录
  • php随机ua
  • Yosemite使用技巧 如何使用Yosemite mac信息功能共享电脑屏幕教程
  • 商品购进核算
  • PHP:Memcached::setMultiByKey()的用法_Memcached类
  • 修建污水处理厂施工方案包括哪些内容
  • uniapp 信息推送
  • 新西兰南岛西南部
  • 小企业会计准则适用于哪些企业
  • php 动态调用类方法
  • 补缴去年的工会经费计提
  • vue3.0路由配置
  • unity udim
  • 个人的无形资产
  • 财政零余额账户存款
  • 其他应收款怎么核对
  • 现金流量表要填满吗
  • 网站用masonry瀑布流无限加载重叠解决方法
  • 建筑业综合税率13.8%
  • 企业固定资产内部控制审计研究论文
  • linux安装ms
  • 差旅费报销原因
  • 用于出口的进项发票怎么做账
  • 如果停产怎么计算成本
  • 成本发票未到如何结转成本
  • 样品 报关
  • 工会经费主要用于什么服务岗位
  • 利息支出可以抵扣进项吗
  • 收到银行承兑汇票计入什么科目
  • 直租业务可以抵房租吗
  • 收到货款但未开票怎么入账
  • mysql数据库中关于作为临时
  • Mysql中FIND_IN_SET()和IN区别简析
  • ubuntu怎么用
  • weather.exe - weather 进程是什么文件
  • ubuntu 21.10安装
  • mscorsvw.exe是什么进程
  • centos7 swap大小设多少
  • linux充当虚拟内存的是哪个分区
  • Win10 Mobile RedStone预览版14267更新内容汇总(持续更新)
  • 麒麟linux系统怎么安装软件
  • 电脑qq清理
  • android:ellipsize="marquee"
  • 批处理之家官网
  • javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
  • jQuery ready()和onload的加载耗时分析
  • javascript快速入门
  • android线程状态
  • 英特尔在哪打开
  • 全面解析李可破格救心汤
  • js对象的常用方法
  • jq中attr用法
  • 增值税发票综合服务平台登录不了
  • 税务处理决定书属于行政处罚吗
  • 成都税务局发票查询
  • 10%加计抵减政策条件
  • 车辆购置印花税需入固定资产吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设