proto 3 语法
一、简介
proto3是新版本的protobuf语法。它简化了部分语法,并扩大了支持的语言,Ruby、C#。目前谷歌推荐只在是用新支持的语言或使用新的gRPC框架的时候使用。
proto2和proto3不是完全兼容的。这里列出一些proto2与proto3的区别。
二、proto3
希望编译器使用proto3进行编译需要在文件对行加上:
syntax = "proto3";
下面是一个简单的例子:
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string loction = 3;
}
可以看到相比于proto2语法这里没有前面的required/optional,在proto3中所有字段都是可选的,同时取消了自定义默认值,默认值为0或空。
枚举
与proto2不同proto3的枚举值第一个值得tag必须为0,同时枚举值的默认值将默认使用第一个值,这样就和其他类型都保持了统一,即默认值为0。
enum Location {
SHANGHAI = 0;
BEIJING = 1;
GUANGZHOU = 2;
}
同时proto2的枚举类型不能被proto3直接import,但是间接引用不受影响。
Any
proto3不支持proto2中的extension,但是引入了Any。
在使用Any时需要引入any.proto:
import "google/protobuf/any.proto";
message ErrorStatus {
string message = 1;
repeated google.protobuf.Any details = 2;
}
-----------------------
public static void main(String[] args) throws IOException, ClassNotFoundException {
//定义any
Any any= Any.pack(StringValue.newBuilder().setValue("aaa").build());
//赋值并构建
Demo.Person person=Demo.Person.newBuilder().setDetail(any).build();
//取值
System.out.println(person.getDetail().unpack(StringValue.class));
}
三、其他
proto3去除了proto2中group,新增了一些timestamp、empty的格式(需要手动import)。
proto 3 语法的更多相关文章
- proto 2 语法
一.proto文件 PB的定义是通过proto文件进行定义的,一个标准的类型如下: message SearchRequest { required string query = 1; optiona ...
- github atom创建自己的语法高亮
使用atom一段时间了,有些插件还不是很成熟.比如项目中使用protobuf,早就有人写了语法高亮(https://github.com/podgib/atom-protobuf),但是效果不是很好. ...
- Protobuf 语法指南
英文: Proto Buffers Language Guide 本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样 ...
- iOS 集成Protobuf,转换proto文件
原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...
- protobuf 语法 与 protocol-buffers 的使用
前言 protocol-buffers 是 node.js 平台对支持 protobuf 封装的三方模块,下面的例子都通过 protocol-buffers 的使用来说明. 什么是protobuf G ...
- gRPC-Protocol语法指南
语法指南 (proto3) Defining A Message Type Scalar Value Types Default Values Enumerations Using Other Mes ...
- gRPC源码分析0-导读
gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...
- Protocol buffers 介绍
Protocol buffers和mxl一样在序列化数据结构时很灵活.高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单.目前protocol buffers支持C++.java和p ...
- Protobuf语言指南(转)
Protobuf语言指南 l 定义一个消息(message)类型 l 标量值类型 l Optional 的字段及默认值 l 枚举 l 使用其他消息类型 l 嵌套类型 l 更新一个消息类型 ...
随机推荐
- 在Linux添加定时任务删除5天前的日志文件
利用shell脚本自动清理,脚本如下 1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: fin ...
- 【转】WPF自定义控件与样式(11)-等待/忙/正在加载状态-控件实现
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要有三种实现方式: 简单忙碌状态控件BusyBox: Win8/win10效果忙 ...
- oracle 子查询中null的问题(in 和 not in)
这里的in后面的句子可以理解为or拼接,简单举例即 in (9566,9839,null)可以等价于mgr=9566 or mgr=9839 or mgr=null, not in (9566,983 ...
- 自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持
SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], .. ...
- 使用 ES2015 编写 Gulp 构建
Gulp 自 v3.9.0 版本增加对 Babel 的支持,也就是说可以使用 ES2015 语法来编写 gulp 任务. 检查 gulp 版本 $ gulp -v 确保 gulp-cli 和 gulp ...
- instr
MySQL: select * from tableName where name like '%helloworld%'; Oracle:; select BLACK_VALUE, COUNT(*) ...
- 神经网络和误差逆传播算法(BP)
本人弱学校的CS 渣硕一枚,在找工作的时候,发现好多公司都对深度学习有要求,尤其是CNN和RNN,好吧,啥也不说了,拿过来好好看看.以前看习西瓜书的时候神经网络这块就是一个看的很模糊的块,包括台大的视 ...
- hdu 4486 Pen Counts
Pen Counts Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- .Net逆向初学习
前一段时间逆向一个程序时发现是.net的,然后用OD和IDA都调试不了,最后上网查了一下原来.net的逆向要用专门的工具.这里推荐大家一篇文章去了解一下逆向.net的一些工具简介:http://www ...
- hibernate的merge()
映射文件中的主键如果用sequence序列,需要指定序列名,如果不指定,则会自动使用hibernate_sequence(需要自己创建) getCurrentSession()方法获得的session ...