目录

message介绍

字段规则

标识号

字段映射

默认值

定义多个消息类型

嵌套消息

定义服务(Service)


message介绍

  • protobuf中定义一个消息类型是通过关键字message字段指定的。 消息就是需要传输的数据格式的定义。
  • message关键字类似于C++中的class,Java中的class,go中的struct
  • 在消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型 。
  • 一个proto文件中可以定义多个消息类型

字段规则

  • required:消息体中必填字段,不设置会导致编解码异常。在protobuf2中使用,protobuf3被删除
  • optional: 消息体中可选字段。protobuf3没有了required,optional等说明关键字,都默认为optional
  • repeated: 消息体中可重复字段,重复的值的顺序会被保留在go中重复的会被定义为切片。
message User {string username = 1;int32 age = 2;optional string password = 3;repeated string address = 4;
}

标识号

在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数。

message Person { string name = 1;  // (位置1)int32 id = 2;  optional string email = 3;  repeated string phones = 4; // (位置4)
}

以Person为例,name=1,id=2, email=3, phones=4 中的1-4就是标识号。

字段映射

proto Type Notes C++ Type Python Type Go Type
double double float float64
float float float float32
int32 使用变长编码,对于负值的效率很低,如果你的域有 可能有负值,请使用sint64替代 int32 int int32
uint32 使用变长编码 uint32 int/long uint32
uint64 使用变长编码 uint64 int/long uint64
sint32 使用变长编码,这些编码在负值时比int32高效的多 int32 int int32
sint64 使用变长编码,有符号的整型值。编码时比通常的 int64高效。 int64 int/long int64
fixed32 总是4个字节,如果数值总是比总是比228大的话,这 个类型会比uint32高效。 uint32 int uint32
fixed64 总是8个字节,如果数值总是比总是比256大的话,这 个类型会比uint64高效。 uint64 int/long uint64
sfixed32 总是4个字节 int32 int int32
sfixed32 总是4个字节 int32 int int32
sfixed64 总是8个字节 int64 int/long int64
bool bool bool bool
string 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文 本。 string str/unicode string
bytes 可能包含任意顺序的字节数据。 string str []byte

默认值

protobuf3 删除了 protobuf2 中用来设置默认值的 default 关键字,取而代之的是protobuf3为各类型定义的默认值,也就是约定的默认值,如下表所示:

类型 默认值
bool false
整型 0
string 空字符串""
枚举enum 第一个枚举元素的值,因为Protobuf3强制要求第一个枚举元素的值必须是0,所以枚举的默认值就是0;
message 不是null,而是DEFAULT_INSTANCE

定义多个消息类型

一个proto文件中可以定义多个消息类型

message UserRequest {string username = 1;int32 age = 2;optional string password = 3;repeated string address = 4;
}message UserResponse {string username = 1;int32 age = 2;optional string password = 3;repeated string address = 4;
}

嵌套消息

可以在其他消息类型中定义、使用消息类型,在下面的例子中,Person消息就定义在PersonInfo消息内,如 :

message PersonInfo {message Person {string name = 1;int32 height = 2;repeated int32 weight = 3;} repeated Person info = 1;
}

如果你想在它的父消息类型的外部重用这个消息类型,你需要以PersonInfo.Person的形式使用它,如:

message PersonMessage {PersonInfo.Person info = 1;
}

当然,你也可以将消息嵌套任意多层,如 :

message Grandpa { // Level 0message Father { // Level 1message son { // Level 2string name = 1;int32 age = 2;}} message Uncle { // Level 1message Son { // Level 2string name = 1;int32 age = 2;}}
}

定义服务(Service)

如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer 编译器将会根据所选择的不同语言生成服务接口代码及存根。

service SearchService {//rpc 服务的函数名 (传入参数)返回(返回参数)rpc Search (SearchRequest) returns (SearchResponse);
}

上述代表表示,定义了一个RPC服务,该方法接收SearchRequest返回SearchResponse

【grpc03】proto文件介绍相关推荐

  1. Caffe源码中caffe.proto文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...

  2. proto的介绍和基础使用

    内容摘抄自书籍<Netty redis zookeeper高并发实战> Protobuf使用 proto文件来预先定义的消息格式.数据包是按照proto文件所定义的消息格式完成二进制码流的 ...

  3. Protobuf之proto文件编写规则

    一. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 二. Protobuf消息定义 1.消息由至少 ...

  4. Ectd Raft 模块介绍(二):目录文件介绍

    目录文件介绍 Etcd Raft 模块代码位于 Etcd 源代码库的 raft 目录下 以下是 raft 目录下的目录结构(去除了文档.test 代码): . ├── bootstrap.go ├── ...

  5. protobuf教程(一)---引入其他proto文件

    本章主要介绍了如何在 proto 文件中引入其他 proto 文件. 1. 概述 Protocol buffers 是一种语言无关.平台无关的可扩展机制或者说是数据交换格式,用于序列化结构化数据.与 ...

  6. 编译proto文件python_Python:如何将proto文件编译为python文件

    说明: 最近刚刚开始接触接口的编写,用的是有关grpc远程调用.我还没太搞明白接口是怎么回事,但我的初步目标可以简单理解为生成两个python文件.比如你的proto文件名是ABC,那么我的目标是生成 ...

  7. iOS 集成Protobuf,转换proto文件

    原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...

  8. proto文件导入mysql_导出mysql表结构生成grpc需要的proto文件工具

    使用过grpc的同学都知道,写proto文件比较繁琐,尤其是写message,对应很多字段,为此写了一个简单的从mysql直接读取表结构,生成proto文件的工具. 工具的使用很简单,需要简单的配置, ...

  9. ProtoBuffer由.proto文件生成.cc/.h

    ProtoBuffer由.proto文件生成.cc/.h 一:编译源码 下载地址:http://code.google.com/p/protobuf/downloads/list  下载后,根据编译说 ...

最新文章

  1. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解
  2. 93. 复原 IP 地址(回溯算法)
  3. python中random库中shuffle_[宜配屋]听图阁 - 详解Python中打乱列表顺序random.shuffle()的使用方法...
  4. Netflow的配置方法
  5. mysql数据库优化6_mysql数据库优化
  6. 占空比输出程序c语言,怎样利用c语言来实现占空比的设置?(单片机:SPCE061A)
  7. 神经网络matlab仿真,神经网络模型及其MATLAB仿真程序设计 周开利 等著 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  8. 【数字信号调制】基于BPSK实现信号调制和解调含Matlab源码
  9. winform DevComponents.DotNetBar2 添加到工具栏方法
  10. 【推荐算法论文阅读】STAMP: Short-Term Attention/Memory Priority Model for Session-based Recommendation
  11. 奉劝各位应届毕业生,该打造你的技术影响力了,只会抄代码,该怎么办?
  12. Markdown 数学公式总结
  13. ayit第十周训练g题
  14. STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件
  15. 境外服务器停机:原因、影响以及如何预防
  16. python实现奇异值分解_SVD(奇异值分解)Python实现
  17. ggbiplot | 带箭头的主成分分析(PCA)图绘制
  18. 名编辑电子杂志大师教程 | 怎样安装TTS朗读配音引擎?
  19. Sql Server数据库中的用户及权限配置,保障数据库安全
  20. 使用 Django 部署深度学习模型-2

热门文章

  1. Android8.1 出厂前默认开启USB调试且自动授权,恢复出厂关闭USB调试方案
  2. 外语转录与翻译的音频
  3. servlet对java的重要性_初学者为什么还需要了解Servlets
  4. pyg与graphgym
  5. 什么是WebWorker?
  6. ffmpegB站直播推流
  7. nnU-Net论文解读
  8. 通过淘宝接口用ip获取位置信息
  9. 关于淘宝奇门接口验签问题
  10. 中e管家低收入家庭可不可以理财