gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

640?wx_fmt=png

开发环境:

  • IDE: VSCode

  • VSCode的扩展插件:vscode-proto3和Clang-Format这两个扩展

  • Windows还需要安装Clang,Windows 64位系统的地址如下:Clang for Windows (64-bit)(http://llvm.org/releases/3.7.0/LLVM-3.7.0-win64.exe);Mac:brew install clang-format 。


第一个例子

640?wx_fmt=png
  1. 这行代码表示我们使用的是语法是proto3,之前还有一个proto2;如果你不写这一行,那么protocol buffer编译器会认为你采用的是proto2。这个必须是文件的第一个非空非注释行。

  2. 这里是定义了一个消息名称为FirstMessage,类型是message。它里面定义了三个字段,它们都是标量类型(Scalar Type),你也可以定义复合类型,这个以后再说。

  3. 是指字段(Field)的类型

  4. 字段的名称

  5. 字段的数值(也叫Tag),这个数字是唯一的。它们是用来在信息格式里识别你的字段的,一旦该类型被使用了,那么这个数字就不要再改变了。


640?wx_fmt=png


01

标量类型

640?wx_fmt=jpeg
  • 数值型:数值型有很多种形式:double, float, int32, int64, uint32, uint64, sint32, sint64, fixed32, fixed64, sfixed32, sfixed64。根据需要选择对应的数值类型。

  • 布尔型:bool型可以有True和False两个值。

  • 字符串:string表示任意长度的文本,但是它必须包含的是UTF-8编码或7位ASCII的文本,长度不可超过232。

  •  字节型:bytes可表示任意的byte数组序列,但是长度也不可以超过232  ,最后是由你来决定如何解释这些bytes。例如你可以使用这个类型来表示一个图片。


做个例子

可以自己做一个例子,需求是这样的:这个信息表示的是一个人Person,使用proto3语法,字段如下:ID,姓名,身高,体重,头像,电子邮件,邮件是否已验证。

这个应该没有什么难度,不过要注意一下别忘记标点符号。

640?wx_fmt=png


640?wx_fmt=png

02

关于字段

640?wx_fmt=jpeg

字段的数值(Tag)

      在Protocol Buffers里面,字段的名其实没那么重要,但是写C#代码的时候,字段名还是很重要的。

对于protobuf来说,这个tag是更为重要的。

      可以使用的最小的tag数值是1,最大值是229 - 1, 或者 536,870,911。但是你不可以使用19000到19999之间的数,这部分数是保留的。

      还有一点值得注意的是:

      从1到15的Tag数只占用1个字节的空间,所以它们应该被用在频繁使用的字段上。而从16到2047,则占用两个字节,它们可以用在不频繁使用的字段上。


字段规则

      protobuf的字段必须满足以下两个规则之一:

单数字段(Singular)

      大概意思就是指这个字段只能出现0或1次(不能超过一次),这也是proto3的默认字段规则。


重复字段(Repeated)

      与singular相对的就是repeated。如果你想做一个list或数组的话,你可以使用重复字段这个概念。这个list可以有任何数量(包括0)的元素。它里面的值的顺序将会得到保留。


Repeated Fields 例子

      还是使用前面的Person这个例子,我们在里面添加一个repeated字段(电话号码):

640?wx_fmt=png

      就是在前面加上repeated这个关键字即可。

      在proto3里面,标量类型的repeated字段采用的是packed编码。


注释

      proto文件里可以添加注释。它们通常被当作你定义的这些消息的文档。

      注释很简单,还是两种形式,直接看代码就明白了:

640?wx_fmt=png

保留的字段

      保留的字段如果你对你定义的消息类型进行了更新,例如删除某个字段或者注释掉某个字段,那么其它开发者在以后更新这个消息类型的时候可能会重新使用被你删除/注释掉的字段的数值(tag)。如果以后还需要使用这个消息类型的老版本的proto文件,那么这将会引起严重的问题,例如数据损坏、隐私漏洞等等。

      那么一种避免此类事情发生的解决办法就是将你删除/注释掉的这些字段的数值(或/并且包括字段名,因为字段名可引起JSON序列化的问题)标记为reserved,如果其他人再使用这个数值作为字段标识符,那么编译器就会有错误提示:

640?wx_fmt=png

      注意,不可以把reserved数值和字段名放在同一个reserved语句里。


字段的默认值

当消息被解析的时候,如果编码的消息里不含有特定的一个singular元素,那么在被解析对象里相应的字段就会被设为默认值。

常用类型的默认值如下:

  • string:空字符串

  • bytes:空的byte数组

  • bool:false

  • 数值型:0

  • 枚举enum:枚举里定义的第一个枚举值,值必须是0

  • repeated:通常是相应开发语言里的空list

  • 还有个消息类型的字段,它的默认值和开发语言有关,这个以后再说。



640?wx_fmt=png

03

枚举

640?wx_fmt=jpeg

      之前说了,枚举里面定义的第一个值就是这个枚举的默认值。

      Enum的tag必须从0开始,所以0就是枚举的数值默认值。


继续上个例子

      我们对Person添加一个枚举类型的字段:性别 Gender:

640?wx_fmt=png

      首先需要定义枚举类型,这里定义了一个枚举,名称是Gender,里面有3个值,默认值是NOT_SPECIFIED,数值默认值就是0。

      然后使用这个枚举类型定义了一个字段,名称为gender,tag数为10。


为枚举值起别名

      枚举值是可以起别名的,起别名的作用就是允许两个枚举值拥有同一个数值。

      要想起别名,首先需要设置allow_alias这个option为true:

640?wx_fmt=png

      然后我们为FEMALE这个枚举值起了一个别名叫做WOMAN,它们的数值是一样的。同样的MAN是MALE的数值也是一样的。


      枚举里面的常量的值必须不能超过32位整型的数值,不建议使用负数。

      枚举可以定义在message里面,也可以在外边单独定义以便复用。如果另一个消息想使用Person里面这个Gender枚举,那么可以使用Person.Gender这种形式。


      针对枚举值被删除/注释掉这种情况,它也可以使用reserved:

640?wx_fmt=png

数值和常量名也必须分开使用两个reserved语句。

其中max表示可能的最大的值。

今天先到这。。


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg


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

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

相关文章

[蓝桥杯2016初赛]方格填数

正如题目,我们要保证相邻的数不相连就行了,一共要填十个数。 下面是我的思路,供大家参考一下, 我把上面的各子放进了这个5*6的矩形,其中标记1–10的分别是要填数的各格子,一开始我先初始化这个二维数组为全…

2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

传送门 文章目录题意:思路:题意: 题面挺绕口的,还是看原题比较好。 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后&#xff…

容器化单页面应用中Nginx反向代理与Kubernetes部署

在《容器化单页面应用中RESTful API的访问》一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例。这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景:将Nginx的职责独立出来。注:这里单页面应…

[蓝桥杯2019初赛]迷宫-DFS、BFS两种方法

迷宫问题的最短路&#xff0c;加最小字典序 迷宫文件maze.txt传送门 作者写的2019年B组蓝桥杯解集 . . . DFS的版本 #include<iostream> #include<cstring> using namespace std; const int ax[4]{0,0,1,-1}; const int ay[4]{1,-1,0,0}; const char dir[5]{R,L…

2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵树&#xff0c;让你在第一棵树选一条最长的深度递增的链&#xff0c;链上每一个点在第二棵树上都不互为祖先。 n≤3e5n\le3e5n≤3e5 思路&#xff1a; 之前做过差不多的题传送门。 之前哪个题是不…

xxl-job dotnet core executor执行器开源

DotXxlJob[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现&#xff0c;支持XXL-JOB 2.01 XXL-JOB概述[XXL-JOB][1]是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量…

2019年第十届蓝桥杯 C / C ++省赛 B 组真题题解

A: 组队 输入数据 编号 号位1 2 3 4 51 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 …

HDU - 7054 Yiwen with Formula 分治拆位FFT + dp + 费马小定理降幂

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求aaa的所有子序列的和的乘积。 思路&#xff1a; 看到suma≤1e5sum_a\le1e5suma​≤1e5&#xff0c;这应该会给我们提示&#xff0c;但是我没看到。 我们可以记cntxcnt_xcntx​表示和为xxx的子序列有cnt…

使用Redis创建分布式锁

点击上方蓝色字关注我们~在本文中&#xff0c;我们将讨论如何在.NET Core中使用Redis创建分布式锁。当我们构建分布式系统时&#xff0c;我们将面临多个进程一起处理共享资源&#xff0c;由于其中只有一个可以一次使用共享资源&#xff0c;因此会导致一些意外问题&#xff01;我…

ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

本文我们来探讨下JWT VS Session的问题&#xff0c;我们可直接抛出问题&#xff1a;使用客户端存储的JWT比服务端维持Session更好吗&#xff1f; 既然要比较JWT VS Session&#xff0c;那我们就得知道为何需要JWT和Session&#xff0c;它们共同是为了解决什么问题呢&#xff1f…

P4721 【模板】分治 FFT

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 写一下式子&#xff0c;发现每个fif_ifi​只有左边的fff对他有影响&#xff0c;所以考虑分治FFTFFTFFT来解决这个问题。 先递归左边&#xff0c;让后计算对右边贡献&#xff0c;再递归右边…

程序员生活之路--来自程序员爸爸的一封信

亲爱的孩子&#xff1a;当你看到爸爸这封信的时候&#xff0c;说明你已经长大了或者已经会玩微信公众号了&#xff0c;当然爸爸还是希望你长大了&#xff0c;并不希望你那么小就天天抱着手机刷微信。我写这个文章的时候正直盛夏&#xff0c;现在外边正是37度的高温&#xff0c;…

C#上位机与欧姆龙PLC的通信05---- HostLink协议

1、介绍 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可以对PLC进行I/O读写、可以对PLC进行I/O读写、改变操作模式、强制置位/复位等操作。由于是公开协议&#xff0c;即便是非欧姆龙的上位设备&#xff08;软件&#xff09;&…

Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较套路的一个题&#xff0c;我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少。 转移比较明显&#xff1a;dp[i]max(dp[j])dp[i]max(dp[j])dp[i]max(dp[j]) 其中jjj能…

从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11260750.html源代码&#xff1a;https://github.com/lamondlu/DynamicPlugins前情回顾•从零开始实现ASP…

SP1043 GSS1 - Can you answer these queries I 猫树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 猫树是一种可以O(nlogn)O(nlogn)O(nlogn)预处理&#xff0c;O(1)O(1)O(1)查询的数据结构。预处理的信息应该满足可合并的性质&#xff0c;与线段树pushuppushuppushup的原理相同&#xff0…

动手造轮子:基于 Redis 实现 EventBus

动手造轮子&#xff1a;基于 Redis 实现 EventBusIntro上次我们造了一个简单的基于内存的 EventBus&#xff0c;但是如果要跨系统的话就不合适了&#xff0c;所以有了这篇基于 Redis 的 EventBus 探索。本文的实现是基于 StackExchange.Redis 来实现。RedisEventStore 实现既然…

最小生成树KrusKal算法(并查集)

洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程&#xff0c;其中最主要的就是贪心和并查集的应用。 我们知道链接n个点需要n-1条边&#xff0c;这就满足的最后生成的是一颗树&#xff0c;而不是一个环。在这n-1条边的选择上我们又要尽可能的让边的权重小&#xff0…

#6278. 数列分块 2 分块 + 块内二分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 真 调一晚上血压上来了。 考虑第一个操作&#xff0c;块内打个标记&#xff0c;其他的暴力查询即可。 考虑第二个操作&#xff0c;讲块内元素排序之后&#xff0c;直接二分查询。 注意修改…

使用腾讯云提供的针对Nuget包管理器的缓存加速服务

继阿里巴巴开源镜像站&#xff08;https://opsx.alibaba.com/&#xff09;、华为云镜像站点&#xff08;https://mirrors.huaweicloud.com/ &#xff09;之后&#xff0c;腾讯也已于近日上线了类似的服务&#xff0c;官方名称为腾讯云软件源&#xff08;Tencent Open Source Mi…