一、概述
我們在編寫網絡應用程式的時候需要注意codec(編解碼器),因為資料在網絡中傳輸的都是二進制位元組碼資料,而我們拿到的目标資料往往不是位元組碼資料。是以在發送資料時就需要編碼,接收資料時就需要解碼。
codecd的組成部分有兩個:decoder(解碼器)和encoder(編碼器)。encoder負責把業務資料轉換成位元組碼資料,decoder負責把位元組碼資料轉換成業務資料。
其實Java的序列化技術就可以作為codec去使用,但是他硬傷太多了:
- 無法跨語言
- 序列化後體積太大了,是二進制編碼的5倍。
- 性能低
由于Java序列化技術硬傷太多,是以netty自身提供了一些codec:
netty提供的解碼器:
- StringDecoder,對字元串資料進行解碼。
- ObjectDecoder,對Java對象進行解碼。
- …
netty提供的編碼器:
- StringEncoder,對字元串資料進行編碼。
- ObjectEncoder,對Java對象進行編碼。
- …
netty本身自帶的ObjectDecoder和ObjectEncoder可以實作pojo對象或各種業務對象的編碼和解碼。但是其内部任然是使用Java序列化技術
所有我們不建議使用。那麼我們就需要更進階的編解碼器。
二、Protobuf
protobuf 是Google釋出的開源項目,全稱Google protocol buffers ,特點如下:
- 支援跨平台、多語言(支援絕對多數語言,Java 、c++、c#、python等)
- 高性能、高可靠性
- 使用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檔案
第二步
下載下傳protoc編譯器
下載下傳位址
第三步:
解壓後,打開bin目錄,可以把我們寫好的Book.proto檔案複制到這個路徑下,友善操作
執行指令:protoc --java_out=. Book.proto
說下這裡的 .(點) 就表示目前路徑,如果你的檔案在其他位置就寫檔案的絕對路徑。.(點)和檔案名之間要加空格