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

摘要:
//编写格式为Protov3。与JSON相比,ProtocolBuffers具有以下优势。ProtocolBuffers可用于移动设备上的应用程序、服务器之间的通信或单页应用程序。当然,我们不只是放弃JSON。有时ProtocolBuffers仍然没有JSON的位置。JSON仍然可以作为传统网站和小型网站中的数据传输格式。如果此时使用ProtocolBuffers,可能会花费太多时间和开发成本。首先,去Protobuf的GitHub发布页面。语法=“proto3”;//生成的程序将属于Golang的“protobuf”包。

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

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

而且有趣的是一但你定義了資料結構,你就能在多個語言上使用,像是 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 傳遞的資料格式。

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

(圖片來源: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 釋出頁面

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

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

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

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

2. 安裝 Golang 擴充插件

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

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

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

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

接著進到 $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 檔案,內容大略如下。

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

現在我們就可以在 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/

免责声明:文章转载自《比起 JSON 更方便、更快速、更簡短的 Protobuf 格式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux mint 崩溃1. Ruby基础知识下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Protobuf 语言指南(proto3)

Protobuf 语言指南(proto3)Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单。您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据。 定义消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索...

高效的数据压缩编码方式 Protobuf

一. protocol buffers 是什么? Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。 Protocol buffers 在序列化数据方面,它是灵活的,高效的。相比于 XML 来说,Protocol buffers 更加小巧,更加快速,更加简单。一旦定义了要处理的数据的数据结构之...

Protobuf 语法指南

英文: Proto Buffers Language Guide 本指南描述了怎样使用protocol buffer 语法来构造你的protocol buffer数据,包括.proto文件语法以及怎样生成.proto文件的数据访问类。(本文只针对proto2的语法) 本文是一个参考指南——如果要查看如何使用本文中描述的多个特性的循序渐进的例子,请在http...

protobuf编译

win10   cmake   vs2017编译 protobuf编译 cmake Selecting Windows SDK version 10.0.17134.0 to target Windows 10.0.19042. The C compiler identification is MSVC 19.15.26732.1 The CXX com...

protobuf中文教程(第一篇)

一、什么是protocol buffers       Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议,与XML相比,Protocol buffers序列化后的码流更小、速度更快、操作更简单。你只需要将要被序列化的数据结构定义一次(译注:使用.proto文件定义),便可以使用特别生成的源代码(译注:使用pro...

gRPC .NET Core跨平台学习

前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC。 gRPC 的.NET Core 包在NuGet 上发布了,结合.NET Core 实现gRPC 完美跨平台。 本篇主要讲解 .NET Core 版gRPC客户端运行在Ubuntu系统上,与局域网内的服务端通信。 下面我们来正式开始。...