Protocol Buffers 的使用 (一)

Protocol Buffers在MCU上的使用方法(一)——Nanopb 什么是Protocol Buffers 简单定义: Protocol Buffer是谷歌推出的,和开发语言无关、平台无关、可扩展的机制,用于序列化结构化数据——像XML,但它更小、更快、更简单。 关键点: 1、跨平台。 2、可扩展。 3、序列化结构化数据。 4、使用简单。 官方网址: Protocol Buffers 支持最常使用的语言 1、C++ 2、C# 3、Java 4、Python 5、… Protocol Buffers的使用场景和使用方法这里就不做过多的解释了,因为网上都有非常详细的说明,毕竟使 阅读详情
一 Protocol Buffers 简介

      Protocol Buffers是一个独立于语言和平台的,扩展性良好的存取结构数据的技术,主要用于传输协议格式和数据存储方面。 它是Google公司的一个开源 项目,最初用以解决索引服务器的请求、响应协议。
      简单地说,Protocol Buffers其实和XML 差不多,也就是把某种数据结构的信息,以某种格式保存起来。
      和XML相比,Protocol Buffers的性能好和效率比XML高,XML序列化和反序列化的速度没有Protocol Buffers效率高,尤其是反序列化的速度。还有就是空间的开销,XML格式为了有较好的可读性,引入了一些冗余的文本信息。由于Google公司赖以吹嘘的就是它的海量数据和海量处理能力。对于几十万、上百万机器的集群,动不动就是PB级的数据量,哪怕性能稍微提高 0.1% 也是相当可观。所以Google自然无法容忍XML在性能上的明显缺点,正是在这样的情况以protobuf也就应运而生了。 
   
       另外,Protocol Buffers具有良好的版本兼容性,在原协议更新后,原有的老的协议可以继续在新协议上使用。

        现在Google官方发布标准Protocol Buffers包支持C++,java,Python,包含一个Protocol Buffers编译器和一个Protocol Buffers使用的类库。除此之外还有开源社区贡献的支持其他语言版本的Protocol Buffers软件包,包括Golang,PHP,C#,Ruby等。在下一篇博客中我将会介绍Go 语言环境中使用Protocol Buffers.

二 Protocol Buffers的使用
   
     1.定义消息格式 --书写.proto 消息描述文件
           从某种意义上讲,可以把proto文件看成是描述通讯协议的规格说明书(或者叫接口规范)。
       a.指定域类型  
          基本类型的描述如下图所示:

      除此之外,还有枚举(enum)和消息(message)类型。
  
      注:1.  group类型已经不建议使用,使用message来代替。
              2.  所有的类型关键字都是小写的 例如message  enum int32 string等。

     b.为每个域指定一个数字标签(TAG)
         
        该标签是将消息转化为二进制格式时用来标示该字段用的,所以在一个消息体内,必须是唯一的。
        
       注:
        1.在进行编码的时候1-15号占用一个字节(包括域的数字标识标签和域的类型); 16-2047占用两个字节,所以在使用的时候尽量使用1-15号来表示经常使用的字段,这样可以减少消息体编码后的长度。
     
     c.指定字段的访问属性
  • required: 非空字段
  • optional: 可选字段
  • repeated: 可重复字段 (相当于一个可变数组,会保持元素的顺序)
   注:1.在使用required字段的时候一定要慎重,例如在实际的应用过程中业务发生了改变,如果你把原来的required改为了optional,那么原来使用required读取消息的使用者在收到新改变后的消息后如果没有这个这个字段的话可能会认为该消息不完整而丢弃。Google工程师建议是尽量少使用requried访问属性
           2.可选字段会有默认的值,对于字符串默认值是空串 整型是零   布尔类型是假 枚举类型是枚举体中的第一个元素,除此之外我们也可以为其指定默认值。例如:
 
 
message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3 [default = 10];
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  optional Corpus corpus = 4 [default = UNIVERSAL];
}

关于消息的定义还应注意以下几点:
       a.可以在一个.proto文件中定义多个message消息表述体,在定义消息体的时候可以添加自己的注释代码,这样增加易读性。
       b.proto的定义是可以引用的,例如: 
   import "myproject/other_protos.proto";
     c.对于message建议使用驼峰命名法,对于消息体内的变量建议使用下划线分割单词的方法,例如:
   message SongServerRequest {
       required string song_name = 1;                                                                }
     d.经过Google Base 128 Varints编码后的二进制流中,每个字段都是以键值对的形式进行序列化,键为字段的Tag编号和类型编号组合。

2.使用protocol buffer编译器
   
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/to/file.proto

  1.proto_path 表示.proto文件所在的文件夹
  2.DST_DIR      表示编译后生成的文件存放路径
    3. ccp_out        表示要产生c++相应代码  
       java_out       表示j要产生ava相应代码
    4.path/to/file.proto 用来表示.proto文件

  注意:--proto_path=IMPORT_PATH 可以使用 -I=IMPORT_PATH 来简写。

3.使用c++ protocol buffer API 来读写消息

https://developers.google.com/protocol-buffers/docs/overview  (需要翻墙)

三 总结   

    什么东西都是两面性,虽然Protocol Buffers “格式小 速度快  兼容性好”,但是它也有自己的缺点。
  
    主要是以下几个方面:
     a.Protocol Buffers可读性差   XML是便于人类阅读和编辑的,而ProtocolBuffer则不是。XML是自解释的,而 ProtocolBuffer仅在你拥有报文格式定义的 .proto 文件时才有意义. XML是自描述的,而protobuf格式则不是,它采用的是二进制格式进行编码(Base 128 Varints)。给你一段二进制格式的协议内容,如果不配合相应的proto文件,那简直就像天书一般。
      
      b.技术比较新   由于protobuf刚公布没多久,相比XML而言,protobuf还属于初出茅庐。因此,在知名度、应用广度等方面都远不如XML。由于这个原因,假如你设计的系统需要提供若干对外的接口给第三方系统调用,俺奉劝你暂时不要考虑protobuf格式。

       总之,Protocol Buffers并不是在任何时候都比XML更合适,例如Protocol Buffers无法对一个基于标记文本的文档建模,因为你根本没法方便的在文本中插入结构。我们应该根据具体的项目需要,选取合适的技术。

补充关于 Google Base 128 Varints
    Google Protobuf里面提出了“Base 128 Varints”编码,这是一种变字节长度的编码,官方描述为:varints是用一个或多个字节序列化整形的一种方法。它的编码方式如下:
  (1)除了最后一个字节,varint中的每个字节的最高位设为1,表示后面还有字节出现,如果是0表示后面没有字节了
           例如:0000 0001表示一个字节     1010 1100 0000 0010表示两个字节,由于第一个字节后面还有一个字节,所以第一个字节的最高位设置为1,表示后面还有后继字节,第二个字节的最高位为0。
  (2)每个字节的低7位看成是一个组(group),这个组和他相邻的下一个7位组共同存储某个整形的“组合表示”,最低有效组在前面。                 
    
      对于1010 1100 0000 0010,去掉每个字节的最高位,我们对两个字节进行分组。第一个7位组:0101100,第二个7位组:0000010,组合起来就是:0101100 0000010,由于最低有效组在前面,所以两个7位组进行调换,结果为:0000010  0101100,中间的空格是为了大家区分,去掉前面的0,也就是:100101100,十进制为1*2^8 + 1*2^5 + 1*2^3 + 1*2^2 = 256 + 32 + 8 + 4 = 300。

   (3)三个字节。我们换种方式,给定某个整形,要求写出他的varint表示,这里当然是落在需要3个字节表示的整形。16380可以吗?不可以!因为16380 < 2^14,所以2个字节足以,我们就以27491为例,27491的二进制表示为:
         0110 1011 0110 0011

     注意这里是高字节之前,低字节在后,和varint的编码规则相反,首先按照7位一组划分为:0000001 1010110  1100011,然后反转为:1100011 1010110  0000001,最后将末尾的7位组前面补0组成一个字节,两个7位组都补1分别组成一个字节:11100011 11010110  00000001

     (4)更多字节。聪明的你可能发现,varint编码中4个字节最大表示的数为2^28,非常正确,同时说明了天下没有免费的午餐,有得有失。Protobuf引入了fixed32解决这个问题的,如果某个字段经常大于2^28,应当优选fixed32,他是固定长度为32位的。

PHP安装protobuf详解 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。当前的google protocol buffer仅支持:C++,Java,Python。PHP作为WEB开发的主力居然没有得到google protocol buffer的官方支持实在是有一些遗憾。 目前PHP支持google protocol buffer的开源实现包括pb4php、phpbuf等。 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 在此主要说明一下支持RPC的phpbuf作为PHP和后端接口通信的接口协议定义。 官方介绍: https://github.com/nowelium/phpbuf 立即下载

相关推荐

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

Protobuf-PHP: 简化 PHP 中的 Protocol Buffers 编码解码过程

Protobuf-PHP: 简化 PHP 中的 Protocol Buffers 编码解码过程 Protobuf-PHP PHP implementation of Google's Protocol Buffers with a protoc plugin compiler ...

gitblog_00055的博客 637

Centos7.6操作系统安装+Bond配置(600GB磁盘版本)

1.安装前准备工作 准备centos7.6操作系统镜像 CentOS-7-x86_64-DVD-1810.iso 服务器安装一般都是在BMC界面操作,所以安装前需要在BMC界面挂载好操作系统镜像 重启服务器后自动进入安装界面。 华为大数据集群安装操作系统配置

小时光 6010

突破PHP性能瓶颈:Protocol Buffers C扩展实战指南

你是否还在为PHP服务端处理大量数据时的性能问题发愁?当JSON解析成为系统瓶颈,当API响应时间不断拉长,是时候考虑更高效的数据交换方案了。本文将带你全面了解Protocol Buffers PHP扩展,从安装配置到性能调优,用实战案例告诉你如何将数据处理速度提升5-10倍,轻松应对高并发服务器场景。 读完本文你将掌握: - Protocol Buffers PHP扩展的两种部署方式(PECL...

gitblog_01120的博客 759

【Unity游戏开发】SDK接入与集成——小白入门篇

一、简介   通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成,对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,而熟悉SDK接入的同学又觉得不断地重复做接入SDK工作这样没有成就感,太尼玛无聊了(Android渠道一弄就十几个,直接吐血)。其实通常情况下接入SDK都是很简单的一个过程,本系列博客就让马三和大家从小白开始,从零基础开始学习如何接入SDK以及一些常见的SDK的...

weixin_34195142的博客 5763

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3297

php安装protocol buffer 扩展,thinkphp引入protocol buffer

文章目录protobuf扩展安装安装protoc代码测试thinkPHP中使用protobuf protobuf protobuf是一个通信协议,类似json和xml。protobuf反序列化之后体积比他们小,而且序列化和反序列化的性能要比他们高(json不一定 如果protobuf层级太多不一定比json快,一般1-3个层级的情况下几乎都是protobuf比较快) 扩展安装 github地址: ...

lingdi2000的专栏 2277

固态变压器SST 1.1 课程整体框架与学习路径

本课程围绕固态变压器(SST)全生命周期工程化流程设计,构建"规范要求-理论基础-设计方法-仿真验证-工程落地"的闭环学习体系,完整覆盖GB/T 40429-2021标准要求。课程分为基础认知、核心设计、合规验证、工程落地和前沿拓展五大模块,采用理论讲解与工程实践深度融合的教学路径,通过规范条款拆解、仿真预验证、硬件实现、试验检测等环节,培养学员从设计到落地的完整能力。课程强调标准合规性,每个设计环节均有明确规范约束,并提供标准化工程模板,确保学习成果可直接应用于实际项目开发。

技术工作者 991

Protocol Buffers PHP 实现:常见问题解决方案

Protocol Buffers PHP 实现:常见问题解决方案 1. 项目基础介绍及编程语言 Protocol Buffers PHP 是一个开源项目,实现了 Google 的 Protocol Buffers(简称 Protobuf)在 PHP 语言中的版本。它支持 PHP 的二进制数据序列化,并且包含一个 protoc 插件,可以从 .proto 文件生成 PHP 类。这种序列化方法特别适合...

gitblog_00532的博客 409

FPGA资料分享——FPGA开发板入手指南

FPGA学习,开发板怎么选,看这里,就一个通透

weixin_51627076的博客 7298

零停机更新黑科技:Spring Boot应用实现无缝升级的实战指南

本文介绍了基于Spring Boot和Tomcat实现零停机更新的技术方案,通过动态端口切换和优雅关闭机制,确保服务更新过程中业务不中断。文章详细解析了核心原理,包括内嵌Tomcat的工作机制、零停机更新的三大技术基石(端口动态切换、优雅关闭和进程接管)。同时提供了完整的Java实现代码,重点展示了端口动态检查、参数动态调整、旧进程优雅终止等关键逻辑。该方案适用于高可用系统升级场景,能够有效避免传统部署方式导致的服务中断问题,实现100%无感知的应用更新。

墨夶的博客 818

Protocol Buffers PHP 扩展教程

Protocol Buffers PHP 扩展教程 项目介绍 Protocol Buffers(简称protobuf)是Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的机制。它类似于JSON,但更小、更快,并且能够生成原生语言绑定。Protocol Buffers PHP扩展允许PHP开发者使用protobuf来序列化和反序列化数据。 项目快速启动 安装 首先,确保你已经安装了P...

gitblog_00845的博客 839

Calibre 3Dstack Flow Example(5-2)

本文详细介绍了Calibre3DSTACK工具在3D-IC设计验证中的应用。主要内容包括:1)连通性检查(LVS)规则编写,重点说明connected命令的使用方法和多文本标签处理;2)设计规则检查(DRC)实现,涵盖层间距检查和焊盘重叠检查;3)系统网表生成器操作流程,从芯片导入到网连通性定义;4)两种规则文件语法(扩展语法和传统语法)的编写示例;5)验证报告文件格式解析。通过具体案例演示了如何建立完整的3D-IC验证流程,包括芯片定义、装配操作、电气连接验证和物理规则检查等关键步骤,为3D-IC设计验证

u013620135的博客 2336

Protocol Buffers 介绍(一)

这段时间项目上接解到了Protocol

Uncle Wang的专栏 4799

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从零到一上手 Protocol Buffers用 C# 打造可演进的通讯录

本文介绍了Protocol Buffers(Protobuf)在.NET中的使用方式,对比了XML/二进制序列化等方案的优缺点。通过一个通讯录示例,详细说明了如何定义.proto文件、生成C#代码、序列化/反序列化数据。重点讲解了Protobuf的版本兼容性规则、反射机制和最佳实践,包括字段标签号管理、调试输出与数据格式区分等。最后提供了快速上手的步骤指南,帮助开发者高效利用Protobuf实现结构化数据的跨语言传输。

hello.reader 1536

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Google Protocol Buffers浅析(一)

本文主要偏向于介绍怎么使用Google的Protocol Buffer技术来压缩与解析你的数据文件,更加详细的信息请参阅Google开放的开发者网页文档,地址为:http://code.google.com/apis/protocolbuffers/docs/overview.html 。      一、简单的介绍      当然,在继续本文之前,读者还是需要对Google Protocol

xiaofengkuang的专栏 7958

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

protocol buffers 文档(一)-语法指导

前言 翻译查阅外网资料过程中遇到的比较优秀的文章和资料,一是作为技术参考以便日后查阅,二是训练英文能力。 此文翻译自 Protocol Buffers 官方文档 Developer Guide 部分 protocol buffers 介绍 protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。protocol buffer...

WindSun's Blog 853

是时候该了解一波Protocol Buffers了[Android]

前言 Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。 它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。 google在2008年7月7号将其作为开源项目对外公布 虽然Protocol Buffers很早就被...

weixin_33698823的博客 248

是时候该了解一波Protocol Buffers了[Java]

前言 Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。 它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。 google在2008年7月7号将其作为开源项目对外公布 虽然Protocol Buffers很早就被...

weixin_33759269的博客 142

protocol-buffers 基础(一)

protocol-buffers 基础

chinusyan的专栏 2028

Protocol Buffers开发者指南(一)——概论

使用教程见:http://www.cppblog.com/woaidongmao/archive/2009/06/23/88391.html Protocol Buffers是在通信协议、数据存储等方面,用来序列化结构化数据,一种语言无关、平台无关、可扩展的解决方案。         这篇概论主要是介绍Protocol Buffers,并且告诉你,如果你要开始使用Protoc

kafeiwuzhuren的专栏 1057

Qt中使用Protocol Buffers(一):使用Qt的MinGW+msys编译Protocol Buffers v2.6.1

使用Qt的MinGW + msys 编译Protobuf-2.6.1

zjzytnn的博客 4441
上一篇: IOS CoreData 使用(二)
下一篇: IOS Block 代码块使用 (二)
张哲BJUT
博客等级 码龄15年 151粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值