【转】protocol buffer开发指南
这个作者的其它golang的文章也值得一读
原文:https://www.cnblogs.com/charlieroro/p/9011900.html
protocol buffer开发指南
---------------------------------------------------------------------
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并不是设计用来处理大消息的,如果有大规格的消息,可以分割解决。
【转】protocol buffer开发指南的更多相关文章
- protocol buffer开发指南(官方)
欢迎来到protocol buffer的开发者指南文档,一种语言无关.平台无关.扩展性好的用于通信协议.数据存储的结构化数据序列化方法. 本文档是面向计划将protocol buffer使用的到自己的 ...
- protocol buffer开发指南
ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift).用户写好 .proto 描述文件,之后使用 protoc ...
- 从零开始山寨Caffe·伍:Protocol Buffer简易指南
你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...
- Google Protocol Buffer开发环境搭建注意事项
PB的安装配置基本上依照网上的教程做就没什么问题:有一点要注意到是当遇到libcmt.lib或msvcrt.lib等lib库与PB中的库冲突时,一定要检查工程的编译方式完全一致,整个项目当中都要注意这 ...
- Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer)
概要 用户服务基本是每个互联网产品里必备的一个服务了,因为没有用户基本是什么也干不了.所以他的重要性不言而喻.本文主要介绍下如何开发一个用户微服务,以及他的详细开发流程. 目录 Go微服务实战 - 从 ...
- Protocol Buffers官方文档(开发指南)
本文是对官方文档的翻译,然后截取了一篇非常优秀的文章片段来帮助理解,本人英文水平有限,基本都是直译,如果有不理解的地方请参考英文官方文档,参考的文章链接在文章末尾 protocol buffers简介 ...
- nodejs开发指南读后感
nodejs开发指南读后感 阅读目录 使用nodejs创建http服务器; supervisor的使用及nodejs常见的调式代码命令了解; 了解Node核心模块; ejs模板引擎 Express 理 ...
- [翻译]Protocol Buffer 基础: C++
目录 Protocol Buffer Basics: C++ 为什么使用 Protocol Buffers 在哪可以找到示例代码 定义你的协议格式 编译你的 Protocol Buffers Prot ...
- Protocol Buffer学习教程之语法手册(二)
1.说明 此向导介绍如何使用protocol buffer language创建一个自己的protocolbuffer文件,包括语法与如何通过“.proto”文件生成数据访问的类,此处只介绍proto ...
随机推荐
- python:如何传递一个列表参数
- HTTP权威指南-报文与状态码
所有的报文都向下流动 报文流向 报文组成 HTTP方法 状态码 GET示例 HEAD示例 100~199 信息性状态码 200~299 成功状态码 300~399重定向状态码 400~499 客户端错 ...
- 虚拟机性能监控与故障处理工具(深入理解java虚拟机三)
JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps ...
- 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]
1 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 2 思路和方法 先给定一个二叉树的样式: ...
- 多进程实现并发服务器(TCP)
前提:基于Linux系统的学习 /*多进程实现并发服务器 父进程任务 1.从未决连接队列中取出请求,建立和客户端的连接,cfd 2.创建子进程 3.close(cfd) 4.负责子进程的收尸工作 子进 ...
- 机器学习之softmax回归笔记
本次笔记绝大部分转自https://www.cnblogs.com/Luv-GEM/p/10674719.html softmax回归 Logistic回归是用来解决二类分类问题的,如果要解决的问题是 ...
- git彻底删除或变更子模块
今天遇到一个很怪的问题,我想把我的一个子模块切换到另一个上游,我按照网上的方法删除子模块然后新建后,这个子模块依旧跟踪着我先前的上游.自己摸索了一下,可能方法比较傻,不过是可行的,希望能给大家一些帮助 ...
- SAS学习笔记53 RTF单个字符标记设置
如何设置RTF中某一个字斜体而之后的字不斜体.下图中第一个P值都斜体并且加粗,第二个P值只有P进行了斜体和加粗
- windows下使用 fdfs_client 上传文件(转)
https://www.cnblogs.com/kindleheart/p/10134502.html 注意:client = Fdfs_client(r"绝对路径"),一定要是绝 ...
- EfCore基本用法
db first 和 code first的基本使用方法 https://www.cnblogs.com/Starts_2000/p/mysql-efcore20-codefirst-dbfirst- ...