日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時間:2023/12/4 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

開發(fā)環(huán)境:

  • IDE: VSCode

  • VSCode的擴展插件:vscode-proto3和Clang-Format這兩個擴展

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


第一個例子

  • 這行代碼表示我們使用的是語法是proto3,之前還有一個proto2;如果你不寫這一行,那么protocol buffer編譯器會認為你采用的是proto2。這個必須是文件的第一個非空非注釋行。

  • 這里是定義了一個消息名稱為FirstMessage,類型是message。它里面定義了三個字段,它們都是標量類型(Scalar Type),你也可以定義復合類型,這個以后再說。

  • 是指字段(Field)的類型

  • 字段的名稱

  • 字段的數(shù)值(也叫Tag),這個數(shù)字是唯一的。它們是用來在信息格式里識別你的字段的,一旦該類型被使用了,那么這個數(shù)字就不要再改變了。



  • 01

    標量類型

    • 數(shù)值型:數(shù)值型有很多種形式:double, float, int32, int64, uint32, uint64, sint32, sint64, fixed32, fixed64, sfixed32, sfixed64。根據(jù)需要選擇對應(yīng)的數(shù)值類型。

    • 布爾型:bool型可以有True和False兩個值。

    • 字符串:string表示任意長度的文本,但是它必須包含的是UTF-8編碼或7位ASCII的文本,長度不可超過232。

    • ?字節(jié)型:bytes可表示任意的byte數(shù)組序列,但是長度也不可以超過232 ?,最后是由你來決定如何解釋這些bytes。例如你可以使用這個類型來表示一個圖片。


    做個例子

    可以自己做一個例子,需求是這樣的:這個信息表示的是一個人Person,使用proto3語法,字段如下:ID,姓名,身高,體重,頭像,電子郵件,郵件是否已驗證。

    這個應(yīng)該沒有什么難度,不過要注意一下別忘記標點符號。


    02

    關(guān)于字段

    字段的數(shù)值(Tag)

    ? ? ? 在Protocol Buffers里面,字段的名其實沒那么重要,但是寫C#代碼的時候,字段名還是很重要的。

    對于protobuf來說,這個tag是更為重要的。

    ? ? ? 可以使用的最小的tag數(shù)值是1,最大值是229 - 1, 或者 536,870,911。但是你不可以使用19000到19999之間的數(shù),這部分數(shù)是保留的。

    ? ? ? 還有一點值得注意的是:

    ? ? ? 從1到15的Tag數(shù)只占用1個字節(jié)的空間,所以它們應(yīng)該被用在頻繁使用的字段上。而從16到2047,則占用兩個字節(jié),它們可以用在不頻繁使用的字段上。


    字段規(guī)則

    ? ? ? protobuf的字段必須滿足以下兩個規(guī)則之一:

    單數(shù)字段(Singular)

    ? ? ? 大概意思就是指這個字段只能出現(xiàn)0或1次(不能超過一次),這也是proto3的默認字段規(guī)則。


    重復字段(Repeated)

    ? ? ? 與singular相對的就是repeated。如果你想做一個list或數(shù)組的話,你可以使用重復字段這個概念。這個list可以有任何數(shù)量(包括0)的元素。它里面的值的順序?qū)玫奖A簟?/p>


    Repeated Fields 例子

    ? ? ? 還是使用前面的Person這個例子,我們在里面添加一個repeated字段(電話號碼):

    ? ? ? 就是在前面加上repeated這個關(guān)鍵字即可。

    ? ? ? 在proto3里面,標量類型的repeated字段采用的是packed編碼。


    注釋

    ? ? ? proto文件里可以添加注釋。它們通常被當作你定義的這些消息的文檔。

    ? ? ? 注釋很簡單,還是兩種形式,直接看代碼就明白了:

    保留的字段

    ? ? ? 保留的字段如果你對你定義的消息類型進行了更新,例如刪除某個字段或者注釋掉某個字段,那么其它開發(fā)者在以后更新這個消息類型的時候可能會重新使用被你刪除/注釋掉的字段的數(shù)值(tag)。如果以后還需要使用這個消息類型的老版本的proto文件,那么這將會引起嚴重的問題,例如數(shù)據(jù)損壞、隱私漏洞等等。

    ? ? ? 那么一種避免此類事情發(fā)生的解決辦法就是將你刪除/注釋掉的這些字段的數(shù)值(或/并且包括字段名,因為字段名可引起JSON序列化的問題)標記為reserved,如果其他人再使用這個數(shù)值作為字段標識符,那么編譯器就會有錯誤提示:

    ? ? ? 注意,不可以把reserved數(shù)值和字段名放在同一個reserved語句里。


    字段的默認值

    當消息被解析的時候,如果編碼的消息里不含有特定的一個singular元素,那么在被解析對象里相應(yīng)的字段就會被設(shè)為默認值。

    常用類型的默認值如下:

    • string:空字符串

    • bytes:空的byte數(shù)組

    • bool:false

    • 數(shù)值型:0

    • 枚舉enum:枚舉里定義的第一個枚舉值,值必須是0

    • repeated:通常是相應(yīng)開發(fā)語言里的空list

    • 還有個消息類型的字段,它的默認值和開發(fā)語言有關(guān),這個以后再說。



    03

    枚舉

    ? ? ? 之前說了,枚舉里面定義的第一個值就是這個枚舉的默認值。

    ? ? ? Enum的tag必須從0開始,所以0就是枚舉的數(shù)值默認值。


    繼續(xù)上個例子

    ? ? ? 我們對Person添加一個枚舉類型的字段:性別 Gender:

    ? ? ? 首先需要定義枚舉類型,這里定義了一個枚舉,名稱是Gender,里面有3個值,默認值是NOT_SPECIFIED,數(shù)值默認值就是0。

    ? ? ? 然后使用這個枚舉類型定義了一個字段,名稱為gender,tag數(shù)為10。


    為枚舉值起別名

    ? ? ? 枚舉值是可以起別名的,起別名的作用就是允許兩個枚舉值擁有同一個數(shù)值。

    ? ? ? 要想起別名,首先需要設(shè)置allow_alias這個option為true:

    ? ? ? 然后我們?yōu)镕EMALE這個枚舉值起了一個別名叫做WOMAN,它們的數(shù)值是一樣的。同樣的MAN是MALE的數(shù)值也是一樣的。


    ? ? ? 枚舉里面的常量的值必須不能超過32位整型的數(shù)值,不建議使用負數(shù)。

    ? ? ? 枚舉可以定義在message里面,也可以在外邊單獨定義以便復用。如果另一個消息想使用Person里面這個Gender枚舉,那么可以使用Person.Gender這種形式。


    ? ? ? 針對枚舉值被刪除/注釋掉這種情況,它也可以使用reserved:

    數(shù)值和常量名也必須分開使用兩個reserved語句。

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

    今天先到這。。


    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?


    總結(jié)

    以上是生活随笔為你收集整理的gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。