比起 JSON 更方便、更快速、更簡短的 Protobuf 格式

Protocol Buffers 是由 Google 所推出的一格式(後台真硬),你可以把它想像成是 XML 或 JSON 格式,但是更小、更快,而且更簡潔。這能夠幫你節省網路與硬體資源,且你只需要定義一次資料結構,接著就會自動生成符合你程式語言的檔案,讓你能夠直接在你的程式上使用。

而且有趣的是一但你定義了資料結構,你就能在多個語言上使用,像是 C++C#GoJavaPythonJavaScript?等,如此一來就不用像 JSON 那樣到不同語言時還要重新定義資料結構。

結構就是文件

首先在傳遞資料前,我們需要定義資料結構。這些檔案以 .proto 作為後輟,有趣的是這些檔案本身就是結構定義檔,所以就不用額外撰寫 API 文件,因為 .proto 檔本身就是一種「文件」。

// 撰寫格式是 Proto v3。
syntax = "proto3";

// User 帶有使用者資料,如帳號、密碼。
message User {
    string username = 1;
    string password = 2;
}

// Post 帶有文章資料。
message Post {
    int64  id      = 1;
    string content = 2;
}

在 Protocol Buffers 中會需要定義資料型態,這讓你明白你應該要傳入什麼類型的資料,這些資料型態可以在這個頁面找到。

後面的數字是什麼?

你可能會好奇為什麼我們需要在每個欄位後面標註數字,實際上這是 Protocol Buffers 編碼與解碼所會用到的編號,這令你能夠移除其中一個欄位而不打亂整個資料結構的編碼與解碼(除非你更改了數字編號)。

與 JSON 比較?

與 JSON 比較,Protocol Buffers 有這些優點。

message User {
    string username = 1;
    string password = 2;
}
  • 資料輕量化:資料非常輕量,省去了不必要的 { 或 : 累贅。
  • 混淆性:在一般人眼中無法輕易地猜測出資料結構為何,因為有經過編碼。
  • 效能高:處理速度很快。
  • 極具方便性:結構就是你的資料模型,你能夠直接在程式中使用這些結構,而不用建立新的物件來接納、映射(Mapping)這些資料。
  • 清晰明瞭、無需文件:.proto 檔案本身就是你的文件,不需要額外撰寫 API 或結構文件來告訴別人你接受怎樣的資料。

在行動裝置的應用程式、伺服器與伺服器之間的通訊,或是單頁應用程式都可以用上 Protocol Buffers。

什麼時候應該繼續用 JSON?

當然也不是一味地拋棄 JSON,在有些時候 Protocol Buffers 仍然沒有 JSON 要來地方便。

{
    "username": "Yami Odymel",
    "password": "test"
}
  • 當你希望資料是人類可解讀的時候。
  • 你不打算直接把接收到的資料拿來處理,你希望從中拿取部分資料作為處理。
  • 你希望在純文字、終端機的情況下就能夠與伺服器溝通。
  • 不想經過任何特殊處理,想直接在瀏覽器中解讀。

在傳統網站、小型網站中仍可使用 JSON 作為資料傳遞的格式,如果此時用上 Protocol Buffers 可能會花費過多的時間與開發成本。

傳遞的內容看起來怎樣?

下面這張圖解釋了 Protocol Buffers 傳遞的資料格式。

(圖片來源:https://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html)

以最下面的範例結果作為例子,這是 Protocol Buffers 傳遞的內容。Protocol Buffers 位元陣列:

[8 185 96 18 11 89 97 109 105 32 79 100 121 109 101 108 26 4 116 101 115 116]

Protocol Buffers 位元陣列轉為字串:

?`
  Yami Odymeltest

解譯成人類可讀:

12345   Yami Odymel   test

比起 JSON 的 { 與 : 要來得更加簡潔,並且傳輸時的容量又更小了。


1. 安裝 Protocol Buffers 生成工具

首先需要安裝 protoc,這是用來將 .proto 檔案轉化為程式的工具。先到 Protobuf 的 GitHub 釋出頁面

滾到最下面,下載符合自己系統的已編譯版本,如此一來就不用再手動編譯。

下載之後解壓縮,然後將 bin/protoc 檔案丟至系統路徑 $PATH,這樣我們就能夠在終端機執行。

2. 安裝 Golang 擴充插件

接下來的教學會以 Golang 為主,其他語言可能要自行參考這裡,首先以 go get 取得 protoc-gen-go

$ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

這是 protoc 的擴充插件,能夠將程式轉化成 Golang 語言。

接著進到 $GOPATH/bin 中會找到我們剛才下載的 protoc-gen-go 檔案,同樣地,將他丟進系統路徑 $PATH,如此一來才能在稍後於終端機內執行。

3. 轉化 Proto 文件

接著我們要將 .proto 轉化成 Golang 程式才能夠在 Golang 中使用,現在新增下列文件,並且將其命名為 example.proto

// 撰寫格式是 Proto v3。
syntax = "proto3";
// 生成的程式在 Golang 中將會屬於 `protobuf` 套件。
package protobuf;

// User 帶有使用者資料,如帳號、密碼。
message User {
    int64  id       = 1;
    string username = 2;
    string password = 3;
}

然後透過下列指令將 .proto 轉化成 Golang 程式。

$ protoc --go_out=. *.proto

然後我們就能得到一個屬於 protobuf 套件的 example.pb.go 檔案,內容大略如下。

現在我們就可以在 Golang 中開始使用這個結構。

4. 解碼與編碼

記得將我們剛才的 example.pb.go 放至 /protobuf 資料夾內(自行手動新增),因為那個檔案屬於 protobuf 套件。

現在我們要透過這些結構來解碼、與編碼資料(注意:下列範例為了簡潔,都忽略了錯誤處理,這是很不好的行為)。

package main

import (
    "fmt"

    "./protobuf"
    "github.com/gogo/protobuf/proto"
)

func main() {
    // 建立一個 User 格式,並在其中放入資料。
    data := protobuf.User{
        Id:       12345,
        Username: "Yami Odymel",
        Password: "test",
    }

    // 將資料編碼成 Protocol Buffer 格式(請注意是傳入 Pointer)。
    dataBuffer, _ := proto.Marshal(&data)

    // 將已經編碼的資料解碼成 protobuf.User 格式。
    var user protobuf.User
    proto.Unmarshal(dataBuffer, &user)

    // 輸出解碼結果。
    fmt.Println(user.Id, " ", user.Username, " ", user.Password)
}

透過下列指令執行。

$ go run main.go

接著我們就能夠得到這樣的結果。

12345   Yami Odymel   test

上面這個結果是由資料編碼成 Protocol Buffers 然後解碼所得到的。

from: https://yami.io/protobuf/

原文地址:https://www.cnblogs.com/GarfieldEr007/p/10113322.html

时间: 2024-11-10 18:38:06

比起 JSON 更方便、更快速、更簡短的 Protobuf 格式的相关文章

如何才能更快速更全面直观的了解当下所发生的新闻事件?

二十一世纪什么最贵?你以为我会回答人才吗?不,今天我要说:二十一世纪最贵的,是资讯. 曾几何时,资讯是珍贵的,只为少数人所掌握的内容:曾几何时资讯的传播方式还局限于飞鸽传书.烽火狼烟:曾几何时,资讯的呈现方式还只有竹简.泥石板等--从历史的洪流中一路走来,我们不难发现,资讯二字变得越来越普遍,资讯的获取方式也越来越多样.只要你想知道,似乎什么资讯都可以在互联网获取. 二十一世纪是信息爆炸的时代,但二十一世纪的核心事件,却是对信息的颠覆.获取资讯固然容易,但如何快速获取有效高价值的资讯却成立难题.

取代HT1621B更少脚位更少点数:24/56/72/88/128点阵段码液晶驱动IC

产品型号:VK1024B 产品品牌:VINTEK/元泰/VINKA 封装形式:SOP16 VK1024概述: VK1024B 是 24 点. 内存映象和多功能的 LCD 驱动, VK1024B 的软件配置特性使它适用于多种 LCD 应用场合,包括 LCD 模块和显示系统,用于连接主控制器和 VK1024B 的管脚只有 4 条, VK1024B 还有一个节电命令用于降低系统功耗.封装:SOP16 特点: ★ 工作電壓: 2.4V-5.2V ★ 內嵌 256KHz RC oscillator ★ 可

2019年Python、Java、C++学哪个更好?薪资更高?

首先,我认为编程语言是没有最好,只有最合适.但是未来预测这种事还是留给大神,这边就分享给楼主一些"干货" 最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题. Python 难度:★ 欢迎度:★★★★☆ 创始于:1991年 学完之后可以干什么: web开发.应用开发.大数据.数据挖掘.科学计算.机器学习.人工智能.运维.自然语言处理等等等. 就业薪资: 2019年Python.Java.C++

萨里:热刺离新赛季正式开始更近,备战更充分

萨里:热刺离新赛季正式开始更近,备战更充分 By admin 0 Comment 2019年7月22日 北京时间7月21日讯 在刚停止的国际冠军杯比赛中,尤文图斯2-3不敌热刺,这也是萨里执教尤文的首场比赛.赛后,萨里接受了采访,谈到了本场比赛得胜的原因. "这是一场艰难的比赛,对手是一支申明 远扬的球队.他们速度更快.更有爆发力:然而他们离新赛季正式起头更近,备战也更充足." 据悉,热刺的英超首战将在8月11号打响,他们将在主场对阵阿斯顿维拉:意甲联赛则将于8月25日起头. 萨里继续

Nvidia发布更快、功耗更低的新一代图形加速卡

导读 不出意外的,Nvidia在其举行的Supercomputing 19大会上公布了很多新闻,这些我们将稍后提到.但被忽略的一条或许是其中最有趣的:一张更快.功耗更低的新一代图形加速卡. 多名与会者与多个新闻站点发现了这点,Nvidia 向我证实这确实是一张新卡.Nvidia的“Volta” 这代 Tesla GPU 加速卡在 2017 年就已淘汰,因此升级工作应该早已过期. V100S 目前仅提供 PCI Express 3 接口,但有望最终支持 Nvidia 的 SXM2 接口.SXM 是

怎样快速把ppt转换成pdf格式

怎样快速把ppt转换成pdf格式 经常处理文件的你是不是还在为ppt文本如何转入pdf文档而发愁呢?或者对密密麻麻的pdf文件内容不能快速阅览而犯愁呢?下面,小编介绍2种将ppt演示文稿里的文字转换成pdf文档的方法,以供分享. 1.号称“精准”的迅捷ppt转换成pdf转换器 优点:简单方便的快速提取ppt文字.图片的方案,轻松解决批量ppt文档文字乱码问题: 即使你的电脑里面没有安装任何的PDF阅读器软件,或者PDF转换器,您也能够轻松的把朋友发来的PDF文档中的文字内容提取出来,并且有不少要

快速加载DXF、DWG格式文件控件ABViewer

ABViewer是一种高品质,低成本,高效率的多功能设计及工程文档管理应用程序. ABViewer为您提供专业的cad文件浏览和编辑工具. 支持多种格式,如:DWG格式, DXF, DWF, Hewlett-Packard HPGL, PLT, HGL, CGM, SVG, TIFF, BMP, JPG, GIF etc 等. 具体功能: ABViewer它可以方便我们在下述几种情况下大大节省时间: 当您需要在您的MS Word 文档中导入CAD图像时 您可以获得比常规软件快两倍的CAD文件(D

电脑上怎么将多张CAD图纸文件快速转换成高清图片格式?

电脑上怎么将多张CAD图纸文件快速转换成高清图片格式?将CAD图纸文件进行格式转换成图片样式是CAD相关的工作中经常需要进行的,为了方便将图纸文件进行打开查看或是将其进行传输,都会需要将其进行转换成图片格式,具体应该怎么样进行操作,下面小编就要来教大家的就是电脑上怎么将多张CAD图纸文件快速转换成高清图片格式的全部操作步骤,希望能够帮助到你们! 步骤一:首先需要进行打开操作的是你们电脑上面的 迅捷CAD转换器软件,电脑上面没有这款软件的可以去到迅捷CAD官网上面进行下载安装! 步骤二:将其下载之

更快速更省电的全球ublox agps 星历下载服务-minigps出品

现在带gps定位功能的设备越来越多,如何快速定位和省电,是大家最关心的问题. agps星历是解决这两个问题的最佳选择,ublox和mtk公司一直有提供星历下载功能,但很少客户去用. 有几方面原因导致用户没去增加agps功能: 1. gps芯片代理商,只顾出货,出一个芯片就有钱赚,软件的问题他们其实也太懂也懒得去搞懂,没有向客户推广的动力. 2. gps芯片厂商对agps使用的限制,ublox和mtk都对星历的下载限制了,需要申请对于的账号,另外开发文档只对代理商公开. 3. 设备开发商本身也没有