天天看點

protobuf一、概述二、Protobuf

一、概述

我們在編寫網絡應用程式的時候需要注意codec(編解碼器),因為資料在網絡中傳輸的都是二進制位元組碼資料,而我們拿到的目标資料往往不是位元組碼資料。是以在發送資料時就需要編碼,接收資料時就需要解碼。

protobuf一、概述二、Protobuf

codecd的組成部分有兩個:decoder(解碼器)和encoder(編碼器)。encoder負責把業務資料轉換成位元組碼資料,decoder負責把位元組碼資料轉換成業務資料。

其實Java的序列化技術就可以作為codec去使用,但是他硬傷太多了:

  1. 無法跨語言
  2. 序列化後體積太大了,是二進制編碼的5倍。
  3. 性能低

由于Java序列化技術硬傷太多,是以netty自身提供了一些codec:

netty提供的解碼器:

  1. StringDecoder,對字元串資料進行解碼。
  2. ObjectDecoder,對Java對象進行解碼。

netty提供的編碼器:

  1. StringEncoder,對字元串資料進行編碼。
  2. ObjectEncoder,對Java對象進行編碼。

netty本身自帶的ObjectDecoder和ObjectEncoder可以實作pojo對象或各種業務對象的編碼和解碼。但是其内部任然是使用Java序列化技術

所有我們不建議使用。那麼我們就需要更進階的編解碼器。

二、Protobuf

protobuf 是Google釋出的開源項目,全稱Google protocol buffers ,特點如下:

  1. 支援跨平台、多語言(支援絕對多數語言,Java 、c++、c#、python等)
  2. 高性能、高可靠性
  3. 使用protobuf 編譯器能自動生成代碼,protobuf 是将類的定義換成 .proto 檔案進行描述,然後通過protoc.exe 編譯器 編譯成 .java檔案

目前使用netty開發的時候,經常使用protobuf作為codec (編解碼器)

<dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.6.1</version>
        </dependency>
           

2.1 如何使用protobuf

第一步先編寫.proto檔案

protobuf一、概述二、Protobuf

第二步

下載下傳protoc編譯器

下載下傳位址

第三步:

解壓後,打開bin目錄,可以把我們寫好的Book.proto檔案複制到這個路徑下,友善操作

protobuf一、概述二、Protobuf

執行指令:protoc --java_out=. Book.proto

說下這裡的 .(點) 就表示目前路徑,如果你的檔案在其他位置就寫檔案的絕對路徑。.(點)和檔案名之間要加空格

protobuf一、概述二、Protobuf
protobuf一、概述二、Protobuf