Java對象序列化與反序列化

(1)什麼是java對象序列化與反序列化java

       對象序列化的意思就是將對象的狀態轉化成字節流,之後能夠經過這些值再生成相同狀態的對象。對象序列化是對象持久化的一種實現方法,它是將對象的屬性和方法轉化爲一種序列化的形式用於存儲和傳輸。反序列化就是根據這些保存的信息重建對象的過程。網絡

 序列化:將java對象轉化爲字節序列的過程。 spa

反序列化:將字節序列轉化爲java對象的過程。.net

(2)爲何要序列化和反序列化對象

當兩個Java進程進行通訊時,可否實現進程間的對象傳送呢?答案是能夠的。進程

一方面,發送方須要把這個Java對象轉換爲字節序列,而後在網絡上傳送;get

另外一方面,接收方須要從字節序列中恢復出Java對象。當咱們明晰了爲何須要Java序列化和反序列化後,咱們很天然地會想Java序列化的好處。其好處一是實現了數據的持久化,經過序列化能夠把數據永久地保存到硬盤上(一般存放在文件裏),二是,利用序列化實現遠程通訊,即在網絡上傳送對象的字節序列。io

(3)序列化ID編譯

       [ 1 ]序列化ID的做用:  class

       這個序列化ID起着關鍵的做用,它決定着是否可以成功反序列化!簡單來講,Java的序列化機制是經過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地實體類中的serialVersionUID進行比較,若是相同則認爲是一致的,即可以進行反序列化,不然就會報序列化版本不一致的異常。
 

        [ 2 ]序列化ID如何產生:

當咱們一個實體類中沒有顯示的定義一個名爲「serialVersionUID」、類型爲long的變量時,Java序列化機制會根據編譯時的class自動生成一個serialVersionUID做爲序列化版本比較,這種狀況下,只有同一次編譯生成的class纔會生成相同的serialVersionUID。例如:當咱們編寫一個類時,隨着時間的推移,咱們由於需求改動,須要在本地類中添加其餘的字段,這個時候再反序列化時便會出現serialVersionUID不一致,致使反序列化失敗。那麼如何解決呢?即是在本地類中添加一個「serialVersionUID」變量,值保持不變,即可以進行序列化和反序列化。

相關文章
相關標籤/搜索