最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解vue中使用protobuf踩坑記

 更新時間:2019年05月07日 09:14:26   作者:小緦lv  
這篇文章主要介紹了vue中使用protobuf踩坑記,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

官方解釋為:

Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the "old" format.

翻譯是(機(jī)翻---我英語不好)

協(xié)議緩沖區(qū)是用于序列化結(jié)構(gòu)化數(shù)據(jù)的靈活,高效的自動化機(jī)制 - 思考XML,但更小,更快,更簡單。您可以定義一次數(shù)據(jù)的結(jié)構(gòu),然后您可以使用特殊的源代碼輕松地將結(jié)構(gòu)化數(shù)據(jù)寫入各種數(shù)據(jù)流并使用各種語言讀取和讀取數(shù)據(jù)。您甚至可以更新您的數(shù)據(jù)結(jié)構(gòu),而不會中斷根據(jù)“舊”格式編譯的已部署程序。

特點:

  • 更簡單
  • 是3到10倍小
  • 速度要快20到100倍
  • 不太模糊
  • 生成更易于以編程方式使用的數(shù)據(jù)訪問類

代碼

在github上寫了個demo demo地址 有需要的可以下載下來跑一下就理解了。PS:如果覺得有用 請給我個小星星 (筆芯~)

使用

其實最開始我嘗試使用一個第三方JSprotobuf.js protobuf.load 的時候瀏覽器報了個錯illegal token '<' (/demo.proto, line 1) 查找了下官網(wǎng)issue,大意應(yīng)該是proto文件多了個字符,但是我查看過proto文件并沒有發(fā)現(xiàn)有多的'<',怎么辦呢,最后放棄使用第三方。用官方提供的方法。

下載protobuf編譯器

下載地址 (我下載的是3.40版) github也提供了zip包,可自行下載 (目前最新版本是v3.6.0) 用來編譯proto為JS文件方便調(diào)用

配置環(huán)境變量

由于公司用的是win10 只需要將下載的文件地址添加到path即可 Mac與window命令唯一的區(qū)別就是需要將protoc改成protoc.exe 前提是需要添加環(huán)境變量

編寫proto文件

為了確保前后一致,下面是后臺寫給我的一個測試proto,我司后臺是java

syntax = "proto2";//protobuf版本
option java_package = "com.test.protobuf";
option java_outer_classname = "PersonMessage";
message Person {
 required int32 id = 1;
 optional string name = 2;
 optional string email = 3;
 repeated string list = 4;
 extensions 100 to 1000;//允許擴(kuò)展的ID
}

message PersonTree {
 optional string id = 1;
 optional string title = 2;
 repeated PersonTree childs = 3;
}

extend Person {
 optional int32 count = 101;
 optional int32 likes_cnt= 102;
}

message PersonEx {
 optional int32 id = 1;
 extend Person {
  optional int32 px = 103;
  optional int32 py= 104;
 }
 optional Person p = 2;
}

使用vue-cli構(gòu)建一個工程目錄

npm install -g vue-cli
vue init webpack my-project
cd my-project
npm install
npm run dev

安裝插件: npm install axios element-ui google-protobuf --save

編譯proto為JS

進(jìn)入 awesome.proto 的存放路徑 使用如下命令 protoc.exe --js_out=import_style=commonjs,binary:. awesome.proto

  • 會生成一個awesome_pb.js文件
  • 點擊查看awesome_pb.js其實可以看到里面是生成好的方法。只需要在頁面中引入JS調(diào)用即可

之后我們將這個文件引入頁面,當(dāng)然你也可以考慮全局引用

測試

本地測試

編寫一個測試頁面,創(chuàng)建一個測試按鈕 我是在測試頁面 import messages from './awesome_pb.js' 方法為:

methods: {
  protobufferTest () {
   var message = new messages.Person() // 調(diào)用Person對象 實例化
   // 賦值
   message.setId(23)
   message.setName('asd')
   // 序列化
   var bytes = message.serializeBinary()

   console.log(bytes) // Uint8Array(7) [8, 23, 18, 3, 97, 115, 100]

   // 反序列化
   var message2 = messages.Person.deserializeBinary(bytes)

   console.log(message2) // proto.PersonTree {wrappers_: null, messageId_: undefined, arrayIndexOffset_: -1, array: Array(3), pivot_: 1.7976931348623157e+308, …}

  }
 }

到此,本地測試完成,沒什么毛病了。

前后端聯(lián)調(diào)測試

前方有坑

前后傳輸是使用的FormData,然后悲劇的事情來了。后臺解析不了。查看了下數(shù)據(jù) [8, 23, 18, 3, 97, 115, 100] 確實是傳過去了。

后來排查出原因是應(yīng)該是解析成了字符串,然后數(shù)值變了。所以解析不出來。 后來使用fromCharCode()方法編輯成字符串形式傳輸給后臺。在使用charCodeAt()取值。

此方法已棄用
protobufferTest () {
   var message = new messages.Person() // 調(diào)用Person對象 實例化
   // 賦值
   message.setId(23)
   message.setName('asd')
   // 序列化
   var bytes = message.serializeBinary()

   console.log(bytes) // Uint8Array(7) [8, 23, 18, 3, 97, 115, 100]

   var tests = ''
   for (let index = 0; index < bytes.length; index++) {
    tests += String.fromCharCode(bytes[index])
   }
   console.log(tests) // asd

   // 存入FormData
   let uploadDatas = new FormData()
   uploadDatas.append('protobuf', tests)

   // 使用axios傳輸給后臺
   this.axios.post('/test', uploadDatas)
    .then(function (response) {
     // 將傳回的字符串轉(zhuǎn)為數(shù)組
     console.log(response.data.split('')) // ["↵", "", "3", "2", "", "", "a", "s", "d", "f"]
     let str = response.data.split('')
     let toChar = []
     for (let index = 0; index < str.length; index++) {
      toChar.push(str[index].charCodeAt())
     }
     console.log(toChar) // [10, 2, 51, 50, 18, 4, 97, 115, 100, 102]

     // 后臺傳回來的是PersonTree里面的值所以調(diào)用PersonTree來反序列化
     var message2 = messages.PersonTree.deserializeBinary(toChar)

     console.log(message2) // proto.PersonTree {wrappers_: null, messageId_: undefined, arrayIndexOffset_: -1, array: Array(3), pivot_: 1.7976931348623157e+308, …}

     // 獲取PersonTree的id值
     console.log(message2.getId()) // 32
    })
    .catch(function (error) {
     console.log(error)
    })

  }

以上方法可能存在安全隱患。 向后端傳值 因為FormData支持兩種方式傳輸string和blob所以將bytes存入blob中 前端獲取數(shù)據(jù) 對axios的默認(rèn)傳輸方式做個更改 axios.defaults.responseType = 'arraybuffer' 將以上的JS代碼更改為以下內(nèi)容

protobufferTest () {
   var message = new messages.Person()
   message.setId(23)
   message.setName('asd')
   var bytes = message.serializeBinary()
   
   console.log(bytes)
   let uploadDatas = new FormData()
   var blob = new Blob([bytes], {type: 'application/octet-stream'})

   uploadDatas.append('protobuf', blob)
   
   this.axios.post('/test', uploadDatas)
    .then(function (response) {
     console.log(response)

     var message2 = messages.PersonTree.deserializeBinary(response.data)
     console.log(message2.getId())
    })
    .catch(function (error) {
     console.log(error)
    })
   // console.log(bytes)
  }

至此前后聯(lián)調(diào)完成

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Vue+ElementUI動態(tài)生成面包屑導(dǎo)航教程

    使用Vue+ElementUI動態(tài)生成面包屑導(dǎo)航教程

    Vue和ElementUI都是非常流行的前端開發(fā)框架,它們可以讓我們更加便捷地開發(fā)前端應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于使用Vue+ElementUI動態(tài)生成面包屑導(dǎo)航的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 在vue框架下使用指令vue add element安裝element報錯問題

    在vue框架下使用指令vue add element安裝element報錯問題

    這篇文章主要介紹了在vue框架下使用指令vue add element安裝element報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue3日歷控件的具體實現(xiàn)

    vue3日歷控件的具體實現(xiàn)

    日歷在很多地方都可以使用的到,本文主要介紹了vue3日歷控件的具體實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Vue 3.0自定義指令的使用入門

    Vue 3.0自定義指令的使用入門

    在 Vue 的項目中,我們經(jīng)常會遇到 v-if、v-show、v-for 或 v-model 這些內(nèi)置指令,它們?yōu)槲覀兲峁┝瞬煌墓δ?。除了使用這些內(nèi)置指令之外,Vue 也允許注冊自定義指令。接下來,將使用Vue 3官方文檔自定義指令章節(jié)中使用的示例,來一步步揭開自定義指令背后的秘密。
    2021-05-05
  • 前端Vue設(shè)置cookie、刪除cookie,獲取cookie方式

    前端Vue設(shè)置cookie、刪除cookie,獲取cookie方式

    這篇文章主要介紹了前端Vue設(shè)置cookie、刪除cookie,獲取cookie方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 詳解Vue前端對axios的封裝和使用

    詳解Vue前端對axios的封裝和使用

    這篇文章主要介紹了Vue前端對axios的封裝和使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解如何創(chuàng)建并發(fā)布一個 vue 組件

    詳解如何創(chuàng)建并發(fā)布一個 vue 組件

    這篇文章主要介紹了詳解如何創(chuàng)建并發(fā)布一個vue組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 使用element-ui設(shè)置table組件寬度(width)為百分比

    使用element-ui設(shè)置table組件寬度(width)為百分比

    這篇文章主要介紹了使用element-ui設(shè)置table組件寬度(width)為百分比方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue觸發(fā)input選取文件點擊事件操作

    Vue觸發(fā)input選取文件點擊事件操作

    這篇文章主要介紹了Vue觸發(fā)input選取文件點擊事件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue實現(xiàn)一個帶有緩存功能的Tab頁簽功能

    Vue實現(xiàn)一個帶有緩存功能的Tab頁簽功能

    在現(xiàn)代?Web?應(yīng)用中,Tab?頁簽功能是非常常見的一種交互模式,它可以幫助用戶在不同的視圖間快速切換,而不會丟失當(dāng)前視圖的狀態(tài),本文將介紹如何在?Vue?項目中實現(xiàn)一個帶有緩存功能的?Tab?頁簽功能,需要的朋友可以參考下
    2024-08-08

最新評論

桃园市| 洛扎县| 定陶县| 青神县| 历史| 泰来县| 肥城市| 遂平县| 靖江市| 体育| 皮山县| 卢湾区| 西青区| 敦化市| 建水县| 交口县| 凉城县| 林芝县| 永仁县| 香河县| 孟津县| 大丰市| 宁都县| 黎川县| 萝北县| 工布江达县| 康乐县| 延长县| 精河县| 榆社县| 改则县| 托克逊县| 广丰县| 城步| 东城区| 怀集县| 和林格尔县| 南京市| 马鞍山市| 文昌市| 游戏|