Java併發編程學習-日記9、JSON 與 Protobuf

1、JSON:

  • Jackson開源庫的優點是:所依賴的jar包較少、簡單易用、性能也還不錯,另外Jackson社區相對比較活躍。
  • Jackson開源庫的缺點是:對於複雜POJO類型、複雜的集合Map、List的轉換結果,不是標準的JSON格式,或者會出現一些問題。
  • Gson可以完成複雜類型的POJO和JSON字符串的相互轉換,轉換的能力非常強。
  • 從性能上說,FastJson庫採用獨創的算法,將JSON轉成POJO的速度提升到極致,超過其他JSON開源庫。

在POJO序列化成JSON字符串的應用場景,使用Google的Gson庫;在JSON字符串反序列化成POJO的應用場景,使用阿里的FastJson庫。

2、Protobuf是Google提出的一種數據交換的格式,是一套類似JSON或者XML的數據傳輸格式和規範,用於不同應用或進程之間進行通信。

Protobuf的編碼過程:使用預先定義的Message數據結構將實際的傳輸數據進行打包,然後編碼成二進制的碼流進行傳輸或者存儲。

Protobuf的解碼過程:將二進制碼流解碼成Protobuf自己定義的Message結構的POJO實例。Protobuf既獨立於語言,又獨立於平臺。

Protobuf數據包是一種二進制的格式,相對於文本格式的數據交換(JSON、XML)來說,速度要快很多。由於Protobuf優異的性能,使得它更加適用於分佈式應用場景下的數據通信或者異構環境下的數據交換。Protobuf傳輸協議是最高性能的傳輸協議之一。微信的消息傳輸就採用了Protobuf協議。

Protobuf使用proto文件來預先定義的消息格式。數據包是按照proto文件所定義的消息格式完成二進制碼流的編碼和解碼。proto文件,簡單地說,就是一個消息的協議文件,這個協議文件的後綴文件名爲“.proto”。

在Netty中,內置了一組ProtoBuf編/解碼器——ProtobufDecoder解碼器和ProtobufEncoder編碼器,它們負責Protobuf POJO和二進制字節之間的編碼和解碼。Netty還自帶了一組配套的Protobuf半包處理器:可變長度ProtobufVarint32FrameDecoder解碼器、ProtobufVarint32LengthFieldPrepender編碼器。爲二進制ByteBuf加上varint32格式的可變長度,解決了Protobuf傳輸過程中的粘包/半包問題。

解析複雜的Head-Content協議就需要自定義Protobuf編/解碼器,需要開發者自己去解決半包問題,包括以下兩個方面:

(1)繼承netty提供的MessageToByteEncoder編碼器,完成Head-Content協議的複雜數據包的編碼,將Protobuf POJO編碼成Head-Content協議的二進制ByteBuf數據包。

(2)繼承netty提供的ByteToMessageDecoder解碼器,完成Head-Content協議的複雜數據包的解碼,將二進制ByteBuf數據包最終解碼出Protobuf POJO實例。

Protobuf消息格式,大致有以下幾個可供參考的原則:

  • 原則一:消息類型使用enum定義。
  • 原則二:使用一個Protobufmessage結構定義一類消息。
  • 原則三:建議給應答消息加上成功標記和應答序號。如果一個請求有多個響應,則發送端可以設計爲:每一個響應消息可以包含一個應答的序號,最後一個響應消息包含一個結束標記。接收端在處理的時候,根據應答序號和結束標記,可以合併所有的響應消息。
  • 原則四:編解碼從頂層消息開始。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章