我們都站在巨人的肩膀上
1.序列化:
以特定的方式對類實例的瞬時狀態進行編碼保存的一種操作。將一個對象的狀態(各個屬性量)保存起來,然后在適當的時候再獲得。將數據分解成字節流,以便存儲在文件中或在網絡上傳輸。2.反序列化:
打開字節流并重構對象。對象序列化不僅要將基本數據類型轉換成字節表示,有時還要恢復數據。恢復數據要求有恢復數據的對象實例。3.序列化特點:
如果某個類能夠被序列化,其子類也可以被序列化。聲明為static和transient類型的成員數據不能被序列化重點內容。因為static代表類的狀態, transient代表對象的臨時數據。4.對象序列化:
在沒有序列化前,每個保存在堆(Heap)中的對象都有相應的狀態(state),即實例變量(instance ariable)可以存到文件中,又可以從文件中讀取出來,在堆中創建原來的對象。保存的時候不僅僅保存實例變量的值,JVM也要保存一些信息,比如類的類型等方便將來恢復原來的對象。5.使用場景:
對象序列化可以實現分布式對象。主要應用例如:RMI要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。 java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入字節流中,可以保存在文件中或在網絡連接上傳遞。利用對象序列化可以進行對象的”深復制”,即復制對象本身及引用的對象本身。序列化一個對象可能得到整個對象序列。 當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候。保存這個狀態的作用主要用于不同jvm之間進行類實例間的共享。6.為什么要使用serialVersionUID
對于實現了Serializable接口的類,可以將其序列化輸出至磁盤文件中,同時會將其serialVersionUID輸出到文件中。然后有需要使用時,再從磁盤將對象內容及serialVersionUID讀入內容中的某個對象。將磁盤內容讀入對象時,需要進行強制類型轉換此時,將對比從磁盤讀入的Serializable與對象所屬類的Serializable,若二者一致,則轉換成功。若二者不一致,則轉換失敗,并拋出InvalidClassException。7.serialVersionUID一種就是1L,一種是生成一個很大的數,這兩種有什么區別呢?
就手工遞增版本號。1->2->3…..是根據類的結構產生的hash值。增減一個屬性、方法等,都可能導致這個值產生變化。我想這種方式適用于這樣的場景:開發者認為每次修改類后就需要生成新的版本號,不想向下兼容,操作就是刪除原有serialVesionUid聲明語句,再自動生成一下。新聞熱點
疑難解答