偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

為了一份Mock數(shù)據(jù),開啟了Protobuf的救贖之路

存儲 存儲軟件
Protobuf 作為一種跨平臺、語言無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)的方法,已廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換及存儲。

[[421682]]

一、背景

近期在做一個需求,該需求需要和后端進行交互,為了并行開發(fā),就跟后端產(chǎn)生了如下的對話:

前端:老鐵,可以給份mock數(shù)據(jù)嗎?

后端:mock數(shù)據(jù)太麻煩了,你自己來吧!!!

前端:我怎么知道數(shù)據(jù)長啥樣,如何mock呀!(可憐)

后端:按照約定的接口mock就行,直接給我拋出了一個proto文件

前端:此時已經(jīng)一臉懵逼狀態(tài),proto是個啥?如何根據(jù)proto來mock一份數(shù)據(jù)?后端為什么要用proto,JSON不香嗎?為了彌補上自己欠缺的一環(huán),開啟了Protobuf的救贖之路。

二、Protobuf是什么?

Protobuf 作為一種跨平臺、語言無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)的方法,已廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換及存儲。其目前已經(jīng)支持的開發(fā)語言有多種(C++、Java、Python、Objective-C、C#、JavaNano、JavaScript、Ruby、Go、PHP),詳情可參考(https://github.com/52im/protobuf)。其具有如下優(yōu)缺點:

優(yōu)點

(1)序列化后體積小,適合網(wǎng)絡(luò)傳輸

(2)支持跨平臺、多語言

(3)具有較好的升級和兼容性(具有向后兼容的特性,更新數(shù)據(jù)結(jié)構(gòu)以后,老版本依舊可以兼容)

(4)序列化和反序列化的速度較快

缺點

Protobuf是二進制協(xié)議,編碼后的數(shù)據(jù)可讀性差

三、Protobuf的結(jié)構(gòu)

Protobuf用法的使用有很多,本次就通過一個例子來看看其基本使用,具體使用可以在網(wǎng)上搜索相關(guān)文檔進行學(xué)習(xí)。

  1. syntax = "proto2" 
  2. package transferData; 
  3.  
  4. message transferMessage { 
  5.     required string name = 1; 
  6.     required int32 age = 2; 
  7.     enum SexEnum { 
  8.         Boy = 0; 
  9.         Girl = 1; 
  10.     } 
  11.     optional SexEnum SexEnum = 3; 

1.syntax = "proto2";

該行用于指定語法版本,目前有兩個版本proto2和proto3,兩個版本不兼容,如果不指定,默認語法是proto2.

2.package transferData;

用于定義該包的包名;

3.message

message是Protobuf中最基本的數(shù)據(jù)單元,其中可以嵌套message或其它的基礎(chǔ)數(shù)據(jù)類型的成員;

4.屬性

message中的每一行就是一個屬性,例如required string name = 1,其組成如下所示:

標注 類型 屬性名 屬性順序號 [options]
required string name = 1 一些可選項

(1)標注有三種:

required:必選屬性;

optional:可選屬性;

repeated:重復(fù)字段,類似于動態(tài)數(shù)組;

(2)類型有多種,每種語言不同,例如:int32、int64、int、float、double、string等;

(3)屬性名:用于表征該屬性的名稱;

(4)屬性順序號:protobuf為了提高數(shù)據(jù)的壓縮和可選性等功能定義的,需要按照順序進行定義,且不允許有重復(fù);

(5)[options]:protobuf提供了一些內(nèi)置的options可供選擇想,可大大提高protobuf的擴展性。

5.enum

定義消息類型時,可能需要某字段值是一些預(yù)設(shè)值之一,此時枚舉類型就能夠發(fā)揮作用了。

注:protobuf還有很多用法,此處只做了簡單介紹,有喜歡的同學(xué)可進一步自己深入學(xué)習(xí)。

四、實戰(zhàn)

聊了那么多,下面就進入實戰(zhàn)環(huán)節(jié),實戰(zhàn)將在node運行環(huán)境下,構(gòu)建TCP連接,然后由客戶端發(fā)送經(jīng)過Protobuf序列化的內(nèi)容至服務(wù)端,然后服務(wù)端接收到信息之后進行解析,其中proto文件的序列化和反序列化將使用protobuf.js包,其是一個純 JavaScript 實現(xiàn),支持node.js和瀏覽器。它易于使用,速度極快,并且可以使用.proto文件開箱即用!(https://www.npmjs.com/package/protobufjs)

4.1 基本使用

本次解析.proto文件使用的是protobuf.js包,常用的方法主要有以下幾個:

1.load()

用該函數(shù)加載對應(yīng)的.proto文件,加載完成之后才能夠使用里面的message以及進行后續(xù)的操作;

2.lookupType()

在加載完.proto后,需要對使用的message進行初始化,即完成message實例化的過程;

3.verify()

該函數(shù)用于驗證普通對象是某滿足對應(yīng)的message結(jié)構(gòu);

4.encode()

編碼一個message實例或者可利用的普通js對象;

5.decode()

解碼buffer至一個message實例,解碼失敗會排除錯誤;

6.create()

從一系列屬性創(chuàng)建一個新的message實例,其優(yōu)于通過fromObject創(chuàng)建,是由于其不會產(chǎn)生冗余的轉(zhuǎn)換;

7.fromObject()

將任何無效的普通js對象轉(zhuǎn)換為message實例;

8.toObject()

轉(zhuǎn)換一個message實例去一個任意的普通js對象。

該庫的使用還有一些其它方法,可以通過看其對應(yīng)文檔進行學(xué)習(xí)。對于上述轉(zhuǎn)換關(guān)系如下圖所示(來自于官方文檔):

4.2 服務(wù)端

其是服務(wù)端,當接收到客戶端發(fā)送的消息后,利用protobufjs庫中的decode函數(shù)進行解析,獲取解析后的結(jié)果。

  1. const net = require('net'); 
  2. const protobuf = require('protobufjs'); 
  3.  
  4. const decodeData = data => { 
  5.     protobuf.load('./transfer.proto'
  6.     .then(root => { 
  7.         const transferMessage = root.lookupType('transferData.transferMessage'); 
  8.  
  9.         const result = transferMessage.decode(data); 
  10.         console.log(result); // transferMessage { name'狍狍', age: 1, sexEnum: 1 } 
  11.     }) 
  12.     .catch(console.log); 
  13. const server = net.createServer(socket => { 
  14.     socket.on('data', data =>{ 
  15.         decodeData(data); 
  16.     }); 
  17.  
  18.     socket.on('close', () => { 
  19.         console.log('client disconnected!!!'); 
  20.     }); 
  21. }); 
  22.  
  23. server.on('error', err => { 
  24.     throw new Error(err); 
  25. }); 
  26.  
  27. server.listen(8081, () => { 
  28.     console.log('server port is 8081'); 
  29. }); 

4.3 客戶端

其是客戶端對應(yīng)的代碼,利用protobufjs庫進行相應(yīng)的操作,將序列化后的內(nèi)容發(fā)送至服務(wù)端。

  1. const net = require('net'); 
  2. const protobuf = require('protobufjs'); 
  3.  
  4. const data = { 
  5.     name'狍狍'
  6.     age: 1, 
  7.     sexEnum: 1 
  8. }; 
  9.  
  10. let client = new net.Socket(); 
  11. client.connect({ 
  12.     port: 8081 
  13. }); 
  14.  
  15. client.on('connect', () => { 
  16.     setMessage(data); 
  17. }); 
  18.  
  19. client.on('data', data => { 
  20.     console.log(data); 
  21.     client.end(); 
  22. }); 
  23.  
  24. function setMessage(data) { 
  25.     protobuf.load('./transfer.proto'
  26.     .then(root =>{ 
  27.         // 根據(jù)proto文件中的內(nèi)容對message進行實例化 
  28.         const transferMessage = root.lookupType('transferData.transferMessage'); 
  29.  
  30.         // 驗證 
  31.         const errMsg = transferMessage.verify(data); 
  32.         console.log('errMsg', errMsg); 
  33.         if (errMsg) { 
  34.             throw new Error(errMsg); 
  35.         } 
  36.  
  37.         // 轉(zhuǎn)換為message實例 
  38.         const messageFromObj = transferMessage.fromObject(data); 
  39.         console.log('messageFromObj', messageFromObj); 
  40.  
  41.         // 編碼 
  42.         const buffer = transferMessage.encode(messageFromObj).finish(); 
  43.         console.log(buffer); 
  44.  
  45.         // 發(fā)送 
  46.         client.write(buffer); 
  47.     }) 
  48.     .catch(console.log); 

 

責(zé)任編輯:武曉燕 來源: 前端點線面
相關(guān)推薦

2019-04-16 13:57:59

戴爾

2019-11-14 21:21:50

數(shù)據(jù)挖掘數(shù)據(jù)處理數(shù)據(jù)分析

2018-01-29 16:29:35

數(shù)據(jù)開發(fā)從業(yè)

2020-07-15 15:38:15

人臉識別照片活化手機

2018-08-15 13:49:06

數(shù)據(jù)分析學(xué)習(xí)Python

2025-07-03 09:28:44

架構(gòu)群消息開發(fā)

2019-03-24 14:14:40

代碼閱讀源代碼

2020-10-11 21:52:10

數(shù)據(jù)AI指南

2018-07-29 15:33:04

2019-12-03 10:28:53

編程語言PythonJava

2015-03-19 15:17:11

2023-09-29 22:41:26

Kubernetes云原生

2024-11-07 08:50:56

用戶分析分類維度標簽

2018-05-03 07:06:21

開發(fā)規(guī)范iOS

2023-09-01 14:02:25

用戶分析攻略

2020-07-24 09:44:03

安全駐場工程師網(wǎng)絡(luò)安全IT安全

2018-03-09 10:28:30

生態(tài)報告簽收

2022-04-29 08:48:25

開源

2019-07-17 07:07:54

MySQL數(shù)據(jù)庫索引

2024-07-10 12:11:30

數(shù)據(jù)經(jīng)營分析業(yè)務(wù)
點贊
收藏

51CTO技術(shù)棧公眾號