简介

Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。
也可以理解为结构化数据的序列化方法,可简单类比为XML(这里主要是指在数据通信和数据存储这些应用场景中序列化方面的类比,但个人认为XML作为一种扩展标记语言和Protobuf还是有着本质区别的),其具有以下特点:

  • 语言无关,平台无关
    Protobuf支持Java, C++, Python等多种语言,支持多个平台。
  • 高效
    比XML更小(3~10倍),更快(20 ~ 100倍),更为简单。
  • 扩展性,兼容性好
    你可以更新数据结构,而不影响和破坏原有的旧程序。

这里稍微解释一下序列化:
序列化将数据结构或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能是另一个计算环境中)能够被重建回原来的数据结构或对象。

Protobuf 使用

  • 创建.proto文件,定义数据结构
    例如:
//例:在xxx.proto文件中定义Example1 message
message Example1{optional string stringVal =1;optional bytes bytesVal =2;message EmbeddedMessage{int32 int32Val = 1;string stringVal = 2;}optional EmbededMessage embeddedExample = 3;repeated int32 repeatedInt32Val = 4;repeated string repeatedStringVal = 5;
}

我们在上例中定义了一个名为 Example1 的 消息,语法很简单,message 关键字后跟上消息名称:

message xxx{
}

之后我们在其中定义了message具有的字段,形式为:

message xxx {// 字段规则:required -> 字段只能也必须出现 1 次// 字段规则:optional -> 字段可出现 0 次或多次// 字段规则:repeated -> 字段可出现任意多次(包括 0)// 类型:int32、int64、sint32、sint64、string、32-bit ....// 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)字段规则 类型 名称 = 字段编号;
}

在上例中,我们定义了:

  • 类型string,名为stringVal的optional可选字段,字段编号为1,此字段可出现0次或1次
  • 类型bytes,名为bytesVal的optional可选字段,字段编号为2,此字段可出现0次或1次
  • 类型 EmbeddedMessage(自定义的内嵌 message 类型),名为 embeddedExample1 的 optional 可选字段,字段编号为 3,此字段可出现 0 或 1 次
  • 类型 int32,名为 repeatedInt32Val 的 repeated 可重复字段,字段编号为 4,此字段可出现 任意多次(包括 0)
  • 类型 string,名为 repeatedStringVal 的 repeated 可重复字段,字段编号为 5,此字段可出现 任意多次(包括 0)

关于proto2定义message消息的更多语法细节,例如具体支持哪些类型,字段编号分配,import导入定义,请参考文章最后的Reference。

  1. protoc编译.proto文件生成读写接口
    我们在.proto文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。
    当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。那么如何实现呢?不用担心,ProtoBuf 将会为我们提供相应的接口代码。如何提供?答案就是通过 protoc 这个编译器。
    可通过如下命令生成相应的接口代码:
// $SRC_DIR: .proto 所在的源目录
// --cpp_out: 生成 c++ 代码
// $DST_DIR: 生成代码的目标目录
// xxx.proto: 要针对哪个 proto 文件生成接口代码protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto

最终生成的代码将提供类似如下的接口:

Reference:
https://www.jianshu.com/p/a24c88c0526a

Protobuf 详解相关推荐

  1. protobuf详解

    1 protobuf 简介 protobuf (protocol buffer) 是谷歌内部的混合语言数据标准.通过将结构化的数据进行序列化(串行化),用于通讯协议.数据存储等领域和语言无关.平台无关 ...

  2. ProtoBuf - 详解

    之前在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,而在最近的开发中接触到了 Google 的 ProtoBuf. 在查阅相关资料学习 ProtoBuf 以及研读其源码之后 ...

  3. ProtoBuf详解(一)概念和语法

    关于ProtoBuf ProtoBuf 是谷歌开源的一套与语言无关,平台无关,可扩展性强,兼容性好并且效率很高的数据序列化方法,非常适合用于做二进制数据的通信协议和数据存储.这里可以访问官方文档. 很 ...

  4. 【C++】Google Protocol Buffer(protobuf)详解(二)

    代码走读:caffe中protobuf的详细使用过程 [一]proto文件,以caffe.proto中BlobShape为例 syntax = "proto2"; //指明prot ...

  5. ProtoBuf格式详解

    "介绍protobuf编码格式." protobuf是一种数据交换格式,又称PB编码,由Google开源,类似于Json.XML,但其内部是纯二进制格式,比Json,XML等格式要 ...

  6. php把proto解析为文档,Protobuf 文件生成工具 Prototool 命令详解

    Protobuf 文件生成工具 Prototool 命令详解 简介 Prototool 是 Protobuf 文件的生成工具, 目前支持go, php, java, c#, object c 五种语言 ...

  7. protobuf2和3同时安装_在 Ubuntu 上安装 Protobuf 3 的教程详解

    什么时候需要安装 如果使用 protoc 命令,遇到 Protoc not found,表示未安装.或者,执行时出现错误:This parser only recognizes "proto ...

  8. js_long.php,protobuf.js 与 Long.js的使用详解

    这次给大家带来protobuf.js 与 Long.js的使用详解,是急用protobuf.js 与 Long.js的注意事项有哪些,下面就是实战案例,一起来看一下. protobuf.js的结构和w ...

  9. protobuf前后端解析_前端后台以及游戏中使用google-protobuf详解

    前端后台以及游戏中使用google-protobuf详解 [TOC] 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小 ...

最新文章

  1. hyperworks2017安装教程
  2. java参数传入泛型类型_Java 泛型(参数化类型)
  3. 20.4. myisamchk — MyISAM Table-Maintenance Utility
  4. 2014全国计算机二级ms office,2014计算机二级MS Office真题及答案
  5. 洪学海(1967-),男,博士,中国科学院计算技术研究所研究员,信息技术战略研究中心常务副主任。...
  6. gensim训练word2vec并使用PCA实现二维可视化
  7. 制造业ai中台_如何建立自己的制造者工作台
  8. 【LeetCode】【字符串】题号:*557. 反转字符串中的单词 III
  9. cannon linux驱动下载
  10. 二维码生成原理及解析代码
  11. Hive教程(03)- Hive数据模型
  12. 移动云Mas发送普通短信和模板短信
  13. plt.imshow()无法显示两站图片?
  14. PCB治具设计、制造和管理
  15. 超实用的Mac快捷键神器:CheatSheet Mac中文免费版
  16. 如何准备数学建模竞赛
  17. windows2008服务器sa密码修改,关于SQL Server 2008忘记sa密码修改sa密码的方法图解
  18. Googlenbsp;Calendarnbsp;与amp;nbs…
  19. Sqoop技术—安装及使用教程
  20. 给寸照换底色(抠头发)

热门文章

  1. 档案管理系统软件的档案管理包含哪些内容?
  2. 工作那些事(七)选择与被选择
  3. Hbuilder编程设计开发吸取16进制颜色值
  4. Pinyin4j使用介绍
  5. Hibernate中文参考文档(JFIS)
  6. TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11
  7. 【C/C++基础】C语言标准库
  8. Maven+SSM框架项目实例
  9. 如何玩转私域流量运营?
  10. linux boost内存池,开源C++函数库Boost内存池使用与测试