1. 程式人生 > >01分散式基礎(三)-分散式通訊-序列化

01分散式基礎(三)-分散式通訊-序列化

分散式通訊-序列化

java序列化機制Serialize介面

java本身的序列化機制存在的問題

  1. 序列化資料結果比較大、傳輸效率比較低
  2. 不能跨語言對接

以至於在後來的很長一段時間,基於XML格式編碼的物件序列化機制成為了主流,一方面解決了多語言相容問題,另一方面比二進位制的序列化方式更容易理解。以至於基於XML的SOAP協議及對應的WebService框架在很長一段時間內成為各個主流開發語言的必備的技術。

再到後來,基於JSON的簡單文字格式編碼的HTTP REST介面又基本上取代了複雜的Web Service介面,成為分散式架構中遠端通訊的首要選擇。但是JSON序列化儲存佔用的空間大、效能低等問題,同時移動客戶端應用需要更高效的傳輸資料來提升使用者體驗。在這種情況下與語言無關並且搞笑的二進位制編碼協議就成為了大家追求的熱點技術之一。首先誕生的一個開源的二進位制序列化框架-MessagePack。它比google的Protocol Buffers出現得還要早

恰當的序列化協議不僅可以提高系統的通用性、強壯型、安全性、優化效能。同時還能讓系統更加易於除錯和擴充套件

  1. HTTP RESTful
  2. messagePack
  3. Protocol Buffers

Dubbo使用的是Hessian序列化

序列化和反序列化的概念

把物件轉化為位元組序列的過程稱之為物件的序列化,反之,稱之為反序列化

怎麼去實現一個序列化操作

  1. 實現Serializable介面
  2. ObjectInputStream : 表示讀取指定的位元組資料轉換成物件
  3. ObjectOutputStream :

擴充套件

serialVersionUID的作用

檔案流中的class和classpath中的class,也就是修改過後的class,不相容了,處於安全機制考慮,程式丟擲了錯誤,並且拒絕載入。從錯誤結果來看,如果沒有為指定的class配置serialVersionUID,那麼java編譯器會自動給這個class進行一個摘要演算法,類似於指紋演算法,只要這個檔案有任何改動,得到的UID就會截然不同的,可以保證在這麼多類中,這個編號是唯一的。所以,由於沒有顯指定 serialVersionUID,編譯器又為我們生成了一個UID,當然和前面儲存在檔案中的那個不會一樣了,於是就出現了2個序列化版本號不一致的錯誤。因此,只要我們自己指定了serialVersionUID,就可以在序列化後,去新增一個欄位,或者方法,而不會影響到後期的還原,還原後的物件照樣可以使用,而且還多了方法或者屬性可以用。

能夠保證序列化的物件和反序列化後得到的物件是同一個。

靜態變數的序列化

序列化並不儲存靜態變數的狀態

Transient關鍵字

transient關鍵字表示指定屬性不參與序列化

父子類問題

如果父類沒有實現序列化,而子類實現列序列化。那麼父類中的成員沒辦法做序列化操作

序列化的儲存規則

對同一個物件進行多次寫入,打印出的第一次儲存結果和第二次儲存結果,只多了5個位元組的引用關係。並不會導致檔案累加

序列化實現深度克隆

  • 淺拷貝(淺複製、淺克隆):被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺拷貝僅僅複製所拷貝的物件,而不復制它所引用的物件。
  • 深拷貝(深複製、深克隆):被複制物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被複制過的新物件,而不再是原有的那些被引用的物件。換言之,深拷貝把要複製的物件所引用的物件都複製了一遍

總結

  1. 在java中,只要一個類實現了java.io.Serializable介面,那麼它就可以被序列化
  2. 通過ObjectOutputStream和ObjectInputStream對物件進行序列化合反序列化操作
  3. 物件是否允許被反序列化,不僅僅是取決於物件的程式碼是否一致,同時還有一個重要的因素(UID)
  4. 序列化不儲存靜態變數
  5. 要想父類物件也參與序列化操作,那麼必須要讓父類也實現Serializable介面
  6. Transient關鍵字,主要是控制變數是否能夠被序列化。如果沒有被序列化的成員變數反序列化後,會被設定成初始值,比如String -> null
  7. 通過序列化操作實現深度克隆

主流的序列化技術有哪些

  • JSON
  • Hessian(2)
  • xml
  • protobuf
  • kryo
  • MsgPack
  • FST
  • thrift
  • protostuff
  • Avro