proto3语法记录
protobuf 是谷歌的语言无关,平台无关,可扩展的,高效的结构化数据序列化机制,比xml和json的序列化的速度更快,此处记录一下 proto3 的语法,防止以后忘记。
注意:proto3 语法需要注意的事项,见下方代码中的注释
syntax = "proto3"; // 定义这个文件的语法是proto3、默认情况下是proto2 这个指定语法行必须是文件的非空非注释的第一个行。
// 申明一个包
package com.huan.proto;
option java_package = "com.huan.proto"; // 申明一个在 java 中使用的包,如果没有申明这个,则使用外层的 package 申明
option java_outer_classname = "PersonWrapper"; // 表示最后生成java的类名
// 定义一个消息体
// 1、下方每个字段后后面都有一个唯一的标识符,1,2,3,4....,这些标识符是用来在消息的二进制的识别各个字段的,一段开始使用就不可再次改变。
// 2、其中[1,15]的标识符在编码的时候会占一个字节,[16,2047]的标识符会占2个字节,因此我们应该为常用的字段的标识符在[1,15]之内。[19000-19999]为预留的标识符不可使用
// 默认值
// 1、对于strings,默认是一个空string
// 2、对于bytes,默认是一个空的bytes
// 3、对于bools,默认是false
// 4、对于数值类型,默认是0
// 5、对于枚举,默认是第一个定义的枚举值,必须为0;
// 6、对于消息类型(message),域没有被设置,确切的消息是根据语言确定的,
message Person {
// 对应 java 中的 String 数据类型
string personName = 1;
// 对应 java 中的 int 数据类型
int32 age = 2;
// 对应 java 中的 double 数据类型
double salary = 3;
// 对应 java 中的 float 数据类型
float weight = 4;
// 对应 java 中的 boolean 数据类型
bool isMarry = 5;
// 对应 java 中的 long 数据类型
sint64 createTime = 6;
// 对应 java 中的 byte 数据类型
bytes content = 7;
// 对应 java 中的 枚举 数据类型
SexEnum sex = 8;
// 对应 java 中的 List 集合
repeated string friends = 9;
// 对应 java 中的 map 类型 [deprecated = true]表示这个字段已经被废弃了
map<string, string> ext = 10 [deprecated = true];
// 定义一个枚举,不建议在枚举中使用负数,因为枚举值是采用可变编码方式的。
enum SexEnum {
option allow_alias = true; // 当打开这个配置时,可以实现将不同的枚举常量指定为相同的值,比如下方的 WOMEN和NOT_KONWN
MAN = 0; // 在枚举中,第一个值必须是 0
WOMEN = 1;
NOT_KNOWN = 1;
}
// oneof 表示的字段中,表示只有一个字段有值,那么在此处OnlyOneFieldHasValue下的三个字段同一时刻,只有一个字段有值,如果多次赋值,那么后面的值会覆盖前面的值
oneof OnlyOneFieldHasValue {
string username = 11;
Person person = 12;
SexEnum personSex = 13;
}
// reserved 标识的为保留字段,标识不可用,比如前期使用了数字 10,但是现在删除了,后期别人不知道又使用了数字10,那么这个时候是有问题的,应该预留出来,表示不可用
reserved 30, 20, 21;
reserved "could not use field", "myFirends";
}
// 定义一个查询的消息体
message SearchRequest {
string username = 1;
}
// 定义一个RPC服务
service PersonService {
// 定义rpc方法
rpc findPerson1 (SearchRequest) returns (Person);
rpc findPerson2 (stream SearchRequest) returns (Person);
rpc findPerson3 (SearchRequest) returns (stream Person);
rpc findPerson4 (stream SearchRequest) returns (stream Person);
}
// 有了以上 proto 文件,如何生成对应的 java 代码
// protoc --proto_path=import_path_dir --java_out=java_file_out_put_dir path/to/dest_proto_file.proto
// proto_path:表示使用了 import 后,import 的 proto文件所在的目录。如果忽略该值,那么默认是当前目录,如果存在多个目录可以多次使用 --proto_path
// java_out:表示在这个目录中生成java代码
// path/to/dest_proto_file.proto:表示我们需要生成的proto文件所在的位置
有了以上proto文件,那么如何生成 java 代码呢?
语法:protoc --proto_path=为import命令时proto文件所在的路径,如果存在多个,可以写多个--proto_path --java_out=表示生成的java文件的路径 然后接需要生成proto文件的路径。
举例:
需要引入的jar包依赖:
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
proto编译器下载地址:
https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1
proto3语法记录的更多相关文章
- MarkDown常用语法记录
目录 1. 斜体和粗体 2. 分级标题 3. 超链接 3.1 行内式(推荐) 3.2 行外式 3.3 自动链接 4. 锚点 5. 列表 5.1无序列表 5.2有序列表 6. 引用 7. 插入图像 8. ...
- MarkDown基础语法记录
基础语法记录,其中有一些博客园暂不支持 <!--标题--> # 一级标题 # ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 一级标题 ...
- Proto3语法翻译
本文主要对proto3语法翻译.参考网址:https://developers.google.com/protocol-buffers/docs/proto3 defining a message t ...
- SQL 常用语法记录
SQL语法 注意:SQL 对大小写不敏感 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). 数据操作语言 (DML) SQL (结构化查询语言)是用于执行查询的语 ...
- ABAP 新语法记录(一)
原文链接:https://www.cnblogs.com/learnning/p/10647174.html 主要内容 内联声明 构造表达式 内表操作 Open SQL 其他 本文列出了ABAP新语法 ...
- MarkDown语法记录,还在用word,txt编写项目文档吗?
开始之前 是不是在github上看项目的时候第一眼就要看项目介绍? 是不是经常在某些项目的代码里面看到一个README.MD文档 却不知道怎么写? 你是不是不知道,反正我是的. 作为一个程序员,可能写 ...
- SQL SERVER常用语法记录
用于记录SQL SERVER常用语法,以及内置函数. 以下语句包含: WITH 临时表语法 ROW_NUMBER()内置函数,我一般主要是用来分页.针对于查出来的所有数据做一个数字排序 分页的BETW ...
- C++11 语法记录
转自:http://blog.csdn.net/crayondeng/article/details/18563121 一.Lambda表达式 C++ 11中的Lambda表达式用于定义并创建匿名的函 ...
- Markdown的基本语法记录
1.标题 示例代码: # 标题1 ## 标题2 ### 标题3 #### 标题4 ##### ... 效果: 标题1 标题2 标题3 标题4 ... 注:# 后面应保持空格 2. 分级标题 示例代码: ...
随机推荐
- Spring事务管理回滚问题
Spring事务管理不能回滚问题 在前段时间学习SpringMVC的练习中,碰到声明式事务管理时,事务不能回滚的情况,通过查看博客和资料,解决了问题. 原因 导致Spring事务管理不能回滚的原因有两 ...
- 关于Golang的学习路线
基础 安装golang环境 Golang基础,流程控制,函数,方法,面向对象 网络编程(自己做一个简单的tcp的聊天室,websocket,http,命令行工具) 并发(可以看一下并发爬虫或者下载器的 ...
- python+echarts+flask实现对全国疫情数据的爬取并可视化展示
用Python进行数据爬取并存储到数据库,3.15学习总结(Python爬取网站数据并存入数据库) - 天岁 - 博客园 (cnblogs.com) 通过echarts+flask实现数据的可视化展示 ...
- Java面向对象系列(5)- 构造器详解
构造器: 和类名相同 没有返回值 作用: new本质在调用构造器 初始化对象的值 注意点: 定义了有参构造之后,如果想要使用有参构造,必须显示的定义一个无参构造 IDEA快捷键: Alt + Inse ...
- Jmeter扩展组件开发(9) - 解决空指针问题
问题分析 上一节https://www.cnblogs.com/gltou/p/14967005.html功能描述内容为空,导致Jmeter报空指针 CODE List desc = new Arra ...
- Linux系列(41) - 监听命令Vmstart,Top(还需完善)
一.简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控:属于sysstat包:它是对系统的整体情况进行统计 ...
- Shell系列(12)- 预定义变量(5)
预定义变量 作用 $? 常用:最后一次执行的命令的返回状态. 如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了 $$ ...
- Shell系列(11)- 位置参数变量(4)
作用 往shell脚本里面传递参数 位置参数变量 作用 $n n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10} $* 这个变量代表命令行中 ...
- AT1983-[AGC001E]BBQ Hard【dp,组合数学】
正题 题目链接:https://www.luogu.com.cn/problem/AT1983 题目大意 给出\(n\)个数对\((a_i,b_i)\) 求 \[\sum_{i=1}^n\sum_{j ...
- P4494-[HAOI2018]反色游戏【圆方树】
正题 题目链接:https://www.luogu.com.cn/problem/P4494 题目大意 给出\(n\)个点\(m\)条边的一张无向图,节点有\(0/1\),每条边可以选择是否取反两边的 ...