proto2语法

proto文件

protobuf的定义是通过proto文件进行定义的,一个标准的类型如下:

message SearchRequest {required string query = 1;optional int32 page_number = 2 [default = 10];optional int32 result_per_page = 3;
}

其中message定义了类型名字,其中每一个字段有三个选项:

  • required:字段必填。
  • optional: 字段选填,不填就会使用默认值,默认数值类型的默认值为0,string类型为空字符串,枚举类型为第一个枚举值。
  • repeated: 数组类型,可以放入多个类型实例。

之后需要跟上数据类型,在类型之后为字段名。最后跟上“=N”这里N是标记位,每个字段都有标记位,各个字段不能重复且必须为正值,其最大值为 2^29 - 1,同时protobuf内部预留了19000到19999不能被用户使用,官方建议将常用的字段放在前面,由于这个字段的大小随着数值大小增加,如1-16只占用一个字节。最后可以跟上自定义的默认值。
在一个proto文件中可以存放多个message,message内部也可以定义message,外部如需调用需要指明对应的层级关系。同时可以使用import引入外部的proto文件:

//引入外部proto文件
import "other.proto";
//引入外部proto文件,并让引入了该文件的proto文件也能访问被引入类型。
import public "other.proto";

还可以在proto文件中各个级别增加部分编译设置,常用包括:

  • java_package:生成的java包名
  • java_outer_classname :生成的java类名
  • optimize_for:设置编译优化级别,SPEED-默认值速度优先,CODE_SIZE-最小代码量,LITE_RUNTIME-最小运行时占用(适用于环境受限的情况)

数据类型

基础数据类型

protobuf支持大多数基础数据类型,下表包含常用类型,详细列表见官方文档

.protojava实现desc
doubledouble
floatfloat
int32int有符号整形建议使用sint32
uint32int无符号整形
sint32int有符号整形
int64long有符号长整形建议使用sint64
uint64long无符号长整形
sint64long有符号长整形
boolboolean
stringString
byteByteString

枚举类型

protobuf可以定义枚举类型:

enum EnumType {TYPEA = 0;TYPEB = 1;TYPEC = 2;
}

enum的每行字段都是一个枚举值,等号后面跟的是实际值,默认实际值是不能一样的,但只需要增加一个option配置就可以设置一样的值:

enum EnumType {option allow_alias = true;TYPEA = 0;TYPEB = 0;TYPEC = 2;
}

自定义数据类型

还有就是自定义的message类型:

message MessageType {repeated string str = 1;
}message CompositeType {optional MessageType message = 1;
}

oneof

oneof是一种特殊类型可以绑定一组变量,但是只有最后设置的那个变量才生效,之前的变量都会被清除:

-------proto------
message Foo {oneof test_oneof {string name = 1;int32 id = 2;}
}
-------java-------
System.out.println(Demo.Foo.newBuilder().setId(1).setName("name").build().toString());
System.out.println(">>>");
System.out.println(Demo.Foo.newBuilder().setName("name").setId(1).build().toString());
-------输出-------
name: "name"
>>>
id: 1

map

map类型可以接受键值对,键可以使用string或数值类型,值可以使用任意类型:

-------proto------
message Foo {map<string, string> bar = 1;
}
-------java-------
Demo.Foo foo=Demo.Foo.newBuilder().putBar("key1","value1").putBar("key2","value2").build();FileOutputStream fos=new FileOutputStream("D://person");
foo.writeTo(fos);
fos.close();FileInputStream fis=new FileInputStream("D://person");
Demo.Foo foo2=Demo.Foo.parseFrom(fis);
System.out.println(foo2.getBarCount());
fis.close();

extension

Extension有点类似继承,可以向message对象内增加额外的字段:

message Foo {// ...extensions 100 to 199;    //首先需要定义100-199为extension字段
}extend Foo {optional int32 bar = 100; //增加bar字段
}

在使用extension时和普通字段有些不同,Java中如下:

public static void main(String[] args) throws IOException, ClassNotFoundException {//通过setExtension设置字段值Demo.Foo foo=Demo.Foo.newBuilder().setExtension(Demo.bar,1).build();//通过getExtension可以取值System.out.println(foo.getExtension(Demo.bar));FileOutputStream fos=new FileOutputStream("D://person");foo.writeTo(fos);fos.close();FileInputStream fis=new FileInputStream("D://person");//反序列化时需要注册对应的extension字段,不然无法取到extesion的值ExtensionRegistry registry = ExtensionRegistry.newInstance();registry.add(Demo.bar);Demo.Foo foo2=Demo.Foo.parseFrom(fis,registry);System.out.println(foo2.getExtension(Demo.bar));fis.close();
}

转载于:https://www.cnblogs.com/resentment/p/6539021.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 展示视频修改为WriteableBitmap

WPF开发者QQ群&#xff1a;340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇&#xff0c;进行WriteableBitmap性能优化修改后运行对比如下&#xff1a;前&#xff08;C…

linux之类似Windows的资源管理器gnome-system-monitor(可用这个杀死进程)

1、使用 直接运行下面命令gnome-system-monitor 如果没有安装用下面命令安装sudo apt-get install gnome-system-monitor 2、结果 可以点击右键然后杀死相关进程&#xff0c;这也是杀死进程的办法。

HttpClient异常处理手册

HttpClient异常处理手册 开源中国 发表于 2014-08-26 19:44:06异常处理 HttpClient的使用者在执行HTPP方法&#xff08;GET,PUT,DELETE等&#xff09;&#xff0c;可能遇到会两种主要类型的异常&#xff1a; 传输异常协议异常并不是所有的异常都会传播给HttpClient的用户。Htt…

再读《精通css》02:选择器

2019独角兽企业重金招聘Python工程师标准>>> 1.2 为样式找到目标1、类型选择器用来选择特定类型的原素。比如p&#xff0c;a&#xff0c;h1等等。也叫元素选择器或简单选择器。2、后代选择器用来寻找特定元素或元素组的后代。后代选择器由两个选择器之间的空格表示。…

余弦欧式距离matlab,余弦相似度和欧几里得距离

1.余弦相似度同过两个向量的夹角的余弦值来判断两个向量的相似度。余弦值取值[-1,1],越接近1&#xff0c;两向量夹角越小&#xff0c;越相似。图片.png二维公式&#xff1a;图片.pngn维公式&#xff1a;图片.png存在的问题[1]&#xff1a;余弦相似度更多的是从方向上区分差异&a…

App Store 排名获取。

为什么80%的码农都做不了架构师&#xff1f;>>> https://affiliate.itunes.apple.com/resources/documentation/genre-mapping/ app榜示例 &#xff0c; 取中国免费榜前10条&#xff1a; 首先访问 https://itunes.apple.com/WebObjects/MZStoreServices.woa…

使用 Playwright 对 ASP.NET Core 应用执行功能测试

前言在前面的文章中&#xff0c;我们已经介绍过 Playwright for .NET&#xff0c;它常用于自动化测试已经部署好的 Web 应用。其实&#xff0c;开发人员也可以使用它在 ASP.NET Core 应用程序中进行功能测试。功能测试功能测试是从用户角度编写&#xff0c;用于基于其要求验证系…

Android之如何让Android studio编译更快

1、 开启gradle单独的守护进程 在下面的目录下面创建gradle.properties文件 /home/<username>/.gradle/ (Linux) /Users/<username>/.gradle/ (Mac) C:\Users\<username>\.gradle (Windows) 最好是从一个项目里面拷贝过来然后修改下 #Project-wide Gradle …

PHP自动查找指定文件夹下所有文件BOM和删除所有文件

2019独角兽企业重金招聘Python工程师标准>>> <?php if (isset($_GET[dir])){ //设置文件目录 $basedir$_GET[dir]; }else{ $basedir .; } $auto 1; checkdir($basedir); function checkdir($basedir){ if ($dh opendir(…

php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法

Composer项目地址 https://getcomposer.org中文 http://docs.phpcomposer.com/Composer是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库&#xff0c;它会在你的项目中为你安装他们。一、安装Composer官网有详细介绍安装方法&#xff0c;包括windows和linux系统。以…

jquery 入门与知识

一&#xff09;什么是jQuery&#xff1f; 【以封装的思想&#xff0c;重构<<图片显示和隐藏>>】 第三方组织预先写好的一些实用JS文件、类&#xff0c;方法&#xff0c;都统称为JS实用库&#xff0c;免费放在网上&#xff0c;同时配有相关的学习文档和案例&#xf…

基于ASP.NET Core api 的服务器事件发送

现如今程序员对Web API的调用已经是轻车熟路。但是传统的api调用都是拉模式&#xff0c;也就是主动发起请求去调用一个api.但是程序员往往对另一种很有用的模式很陌生&#xff0c;即推模式。拉模式 - 主动调用并获取结果的模式。推模式 - 订阅并接受数据推送的模式。今天要介绍…

Android之解决java.lang.NoSuchMethodError:android.os.powerManager.isInteractive问题

1、问题 再三星平板(Android 4.2.2系统)我们代码powerManager调用了函数isInteractive方法,出现下面错误 java.lang.NoSuchMethodError:android.os.powerManager.isInteractive 2、解决办法 1、一开始想用try catch来解决,肯定不行,功能没实现,而且进程还是会挂 2…

DDD为何叫好不叫座?兼论DCI与业务分析的方法论

今天&#xff0c;仔细阅读了园子里面的一个朋友写的《一缕阳光&#xff1a;DDD&#xff08;领域驱动设计&#xff09;应对具体业务场景&#xff0c;如何聚焦 Domain Model&#xff08;领域模型&#xff09;&#xff1f;》(http://www.cnblogs.com/xishuai/p/3800656.html)这篇博…

css编写规范

一、注释规范 1、文件顶部注释&#xff08;推荐使用&#xff09; Css代码 /* * description: 中文说明 * author: name * update: name (2013-04-13 18:32) */ 2、模块注释 模块注释必须单独写在一行 Css代码 /* module: module1 by 张三 */ … /* module: module2 …

ng的link和comepile

angularJs应用启动之前&#xff0c;它们是以HTML文本形式存在文本编辑器当中。应用启动会进行编译和链接&#xff0c;作用域会同HTML元素进行绑定。 在编译的阶段&#xff0c;angularJs会遍历整个的文档并根据JavaScript中指令定义来处理页面上的指令。 如果设置了compile函数&…

php 实现的字典序排列算法,字典序的一个生成算法

字典序的一个生成算法。最近在LeetCode刷题&#xff0c;刷到一个题&#xff0c;链接&#xff1a;https://leetcode-cn.com/problems/permutation-sequence/这个题要求得长度为n的字典序列的第k个排列。我们知道&#xff0c;字典序列是一个长度为n(n>1)&#xff0c;元素为1~n…

MarkDown之typora

windows上面非常适合用typora&#xff0c;地址如下&#xff1a; https://typora.io/

BeetleX服务网关流量控制

为了保障后台服务应用更可靠地运行&#xff0c;网关提供了一些基础流量控制功能&#xff1b;通过这一功能可以限制流转到后台应用服务的处理量&#xff0c;从而让服务在可应对的并发范围内更可靠地运作。服务网关提供了流量控制有基础控制、IP、域名和请求路径。基础配置主要包…

【cocos2d-x】2.0升级为3.0一些常见变化纪录

1.去CC之前2.0的CC**,把CC都去掉&#xff0c;基本的元素都是保留的2.0CCSprite CCCallFunc CCNode ..3.0Sprite CallFunc Node ..2.cc***结构体改变2.0 ccp(x,y) ccpAdd(p1,p2)ccpSubccpMultccpLength(p)ccpDot(p1,p2);ccc3()ccc4()ccWHITECCPointZeroCCSizeZer…