ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift)。用户写好 .proto 描述文件,之后使用 protoc 可以很容易编译成众多计算机语言(C++、Java、Python、C#、Golang 等)的接口代码。(摘自:ProtoBuf 与 gRPC 你需要知道的知识)

注:本文参考Protocol Buffers 3.0 技术手册,下面给出该文章中未说明的部分

定义Message类型

1 syntax = "proto3";
2
3 message SearchRequest {
4   string query = 1;
5   int32 page_number = 2;
6   int32 result_per_page = 3;
7 }

  首行指定了使用proto3语法,如果没有改行,protocol buffer编译器默认使用proto2。

  field numbers

  4,5,6行中指定了field number,field number的取值范围为1~(229-1)。protocol buffer的预留了19000~19999(FieldDescriptor::kFirstReservedNumber ~ FieldDescriptor::kLastReservedNumber)之间的值。

  field rules

消息字段有2种规则:

  • singular:0或1个,但不能多于1个
  • repeated:任意数目

  default

  当解析 message 时,如果被编码的 message 里没有包含特定变量,根据类型不同,他们会有不同的默认值:

  • string:默认是空的字符串
  • byte:默认是空的bytes
  • bool:默认为false
  • numeric:默认为0
  • enums:定义在第一位的枚举值,也就是0
  • messages:根据生成的不同语言有不同的表现,参考generated code guide

注意:对于scalar(标准protobuf类型,如) message字段,一但message被解析,则没有办法来明确判断该字段设置了默认值(如没法判断一个boolean变量设置为false)或根本没有设置。因此在定义message类型的时候一定要注意,例如,如果不想在默认下有任何动作,则boolean的值在false时不要有动作。此外注意,scalar message字段在设置为默认值时,该值不会被序列化--->即反序列化scalar message字段时是无法反序列化出默认值(因为默认值不会被序列化)

  • 不要修改任何已存在的变量的 Tag
  • 如果你新增了变量,新生成的代码依然能解析旧的数据,但新增的变量将会变成默认值。相应的,新代码序列化的数据也能被旧的代码解析,但旧代码会自动忽略新增的变量。
  • 废弃不用的变量使用两个OBSOLETE_"前缀或用 reserved 标注
  • int32、 uint32、 int64、 uint64 和 bool 是相互兼容的,这意味你可以更改这些变量的类型而不会影响兼容性
  • sint32 和 sint64 是兼容的,但跟其他类型不兼容
  • string 和 bytes 可以兼容,前提是他们都是UTF-8编码的数据
  • fixed32 和 sfixed32 是兼容的, fixed64 和 sfixed64是兼容的
  • enum和int32,int64,uint32,uint64是兼容的(注意:如果类型不一致可能会被截断)。需要注意的是,客户端解码message时可能会给出不同的解释,如未识别的proto3 enum类型会保存在message中,但如何解释则依赖于解码的语言。
  • 改变一个新加的oneof成员值是安全且二进制兼容的;为现有的oneof添加字段则不安全。

未识别的字段

  未识别的字段为序列数据中出现的无法解析的字段,如当老的二进制解析器解析一个包含新字段的二进制时,新字段即为无法识别的字段。

  proto3可以很好地解析未识别的字段,然而proto实现时可能会也可能不会保留这些未知的字段,功能实现不应该依赖于未知字段是否保留或丢弃。

oneof

  oneof类似C语言的联合体union,oneof中不能使用repeated

option

  所有有效的选项都定义在google/protobuf/descriptor.proto,参见option

使用场景 

多消息流

  如果向一个文件或流中写入多个消息,则需要自己去跟踪一个消息的结束和下一个消息的开始。由于protocol buffers不会对自限定长度,解析器无法判定消息的结束点,简单的方式是在写入消息前先写入消息的长度。

大数据集

  protocol buffer并不是设计用来处理大消息的,如果有大规格的消息,可以分割解决。

参考:Language Guide (proto3)

转载于:https://www.cnblogs.com/charlieroro/p/9011900.html

protocol buffer开发指南相关推荐

  1. Protocol buffer---Protobuf3开发指南

    转自:https://blog.csdn.net/u011518120/article/details/54604615 感谢 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类 ...

  2. 从零开始山寨Caffe·伍:Protocol Buffer简易指南

    你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? --欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...

  3. 知心王姐小饭桌 IM消息应用开发:一看看懂Protocol Buffer(协议篇)

    前言 由于笔者业团队的业务对即时通讯服务有很大的依赖,春节结束后的第一天,红包没到,产品同学先到了,产品同学和我说要做一款IM,看到需求文档后和设计图后笔者大吃一斤 这不就是一个翻版的web qq吗? ...

  4. [翻译]Protocol Buffer 基础: C++

    目录 Protocol Buffer Basics: C++ 为什么使用 Protocol Buffers 在哪可以找到示例代码 定义你的协议格式 编译你的 Protocol Buffers Prot ...

  5. C++程序员Protocol Buffers基础指南

    这篇教程提供了一个面向 C++ 程序员关于 protocol buffers 的基础介绍.通过创建一个简单的示例应用程序,它将向我们展示: 在 .proto 文件中定义消息格式 使用 protocol ...

  6. Protocol Buffer Basics: C#

    Protocol Buffer 基础知识:c#    原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial 这 ...

  7. 跨语言RPC框架Hessian、Thrift、Protocol Buffer之间的选择

    为什么80%的码农都做不了架构师?>>>    总结在几者之间选择的考量: 1. 如果你不需要很多语言相互调用, 希望保持清晰的java接口代码(无任何业务不相关的接口继承和方法,属 ...

  8. python中使用 protocol buffer(Protobuf)

    项目中引入proto的依赖 [两种方法]: 方法1. 官网下载对应的语言包,https://github.com/protocolbuffers/protobuf/releases 这里选择pytho ...

  9. Protocol Buffer技术详解(语言规范)

     该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的主要在于不仅可以保持Google文档的良好风格 ...

最新文章

  1. DataGrid连接Access的快速分页法(1)——需求与现状
  2. 获取焦点时,利用js定时器设定时间执行动作
  3. 纠结学哪种编程语言?请看这个回答
  4. java isempty_Optional.isEmpty()即将加入Java吗?
  5. 【POJ - 3026】Borg Maze(bfs预处理 + 最小生成树,建图)
  6. 中芯国际最终超额募资523.2亿元,14nm工艺打“鸡血”了
  7. PowerBI功能发布时间线
  8. sql查询初学者指南_面向初学者SQL Server查询执行计划–类型和选项
  9. 【图像处理】图像强度变换、直方图均衡化(Image Intensity Transformations and Histogram Equalization)
  10. python print tab_Python 字符串 expandtabs() 方法
  11. 使用Apache Ignite构建C++版本的分布式应用
  12. 使用ggplot2画图
  13. 演化博弈论----gyy参考总结
  14. Linux:什么是 i386、i586、 i686、noarch?
  15. 安卓手机通话录音软件
  16. 获取QQ音乐排行榜数据
  17. 使用winserver2003配置DNS服务器
  18. 喝王老吉可延长寿命大约10%?
  19. 开源数值计算软件OCTAVE 、SCILAB、R、Matlab简介
  20. mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

热门文章

  1. ShowSlow+Yslow环境搭建
  2. 搜索引擎中用到的一些拆词方式解析
  3. 互联网欺诈,金钱利益下的汩汩恶意
  4. 推荐系统之CTR预估-FNN模型解析
  5. 实验吧web-易-what a fuck!这是什么鬼东西?
  6. git不区分文件名大小写这种坑当然要跳出来
  7. selenium常见面试题
  8. ie6的png24问题
  9. undefined reference to `main`
  10. flash player 10 音频新API使用:调节音高(pitch)