Netty详解(六):Netty 编解码技术
1. 概述
基于Java提供的對象輸入/輸出流ObjectInputStream和ObjectOutputStream,可以直接把Java對象作為可村粗的字節數組寫入文件,也可以傳輸到網絡上去。Java序列化的目的主要有兩個:
當進行遠程進程服務調用時,需要把傳輸的Java對象編碼為字節數組或者ByteBuffer對象。當遠程服務讀取到ByteBuffer對象或者字節數組時,需要將其解碼為發送的java
對象,這就叫做Java對象編碼技術。
2. Java 序列化的缺點
3. 業界主流的編解碼技術
3.1 Google的protobuf
protobuf全稱Google Protocol Buffers,由谷歌開源而來,將數據結構以.proto文件進行描述,通過代碼生成工具可以生成對應數據結構的POJO對象和Protobuf相關的方法和屬性。
它的特點如下:
Protobut另一個比較吸引人的地方就是它的數據描述文件和代碼生成機制,利用數據描述文件對數據結構進行說明的優點如下。
4. Facebook的Thrift
源于Facebook,支持多種程序,如C++、C#、Cocoa、Erlang、Haskell、Java、Ocami、Perl、PHP、Python、Ruby和Smalltalk。 對于當時的FaceBook來說,創造Thrift是為了解決Facebook各系統間大數據量的傳輸通信以及系統之間的語言環境不同需要跨平臺的特性,因此Thrift可以支持多種語言。
在多種不同的語言之間通信,Thrift可以作為高性能的通信中間件使用,它支持數據(對象)序列化和多種類型的RPC服務。Thrift適用于靜態的數據交換,需要先確定好它的數據結構,當數據結構發生變化時,必須重新編輯IDL文件,生成代碼和編譯。這一點跟其它IDL工具相比可以視為是Thrift的弱項。Thrift適用于搭建大型數據交換及存儲的通用工具,對于大型系統中的內部數據傳輸,相對于JSON和XML在性能和傳輸大小都有明顯的優勢 。
Thrift主要有5部分組成
重點關注的是編解碼框架,與之對應的就是TProtocol。由于 Thrift的RPC服務調用和編解碼框架綁定在一起,所以通常使用Thrift的時候會采取RPC框架的方式,但是它的TProtocol編解碼框架還是可以以類庫的方式獨立使用。
5. JBoss Marshalling
JBoss Marshalling 是一個Java對象的序列化API包,修正了JDK自帶的序列化包的很多問題,但又保持跟java.io.Serializable接口的兼容,同時,增加了一些可調的參數和附加的特性,并且這些參數和特性可通過工廠類進行配置。
相比如傳統的Java序列化機制,它的優點如下:
6. 其他方案
- Kryyo
- Hessian
- FST fast-serialization
- MessagePack(下一章介紹)
總結
以上是生活随笔為你收集整理的Netty详解(六):Netty 编解码技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty详解(五):Netty TCP
- 下一篇: Netty详解(四):Netty 整体架