serialVersionUID
serialVersionUID的作用:序列化時為了保持版本的兼容性,,即在版本升級時反序列化仍保持對象的唯一性,。
類實現(xiàn)了Serializable接口時,如果沒有定義serialVersionUID,,在Eclipse中會提示你去定義,,在Eclipse中點擊類中的warning圖標時,Eclipse提供給我們兩種方式去生成serialVersionUID,,分別是:
1)默認的1L,,如:private static final long serialVersionUID = 1L;
2)根據類名、接口名,、包路徑,、成員方法及屬性等來生成一個64位的哈希字段,比如:private static final long serialVersionUID = -4743699992166046319L;
如果希望類的不同版本對序列化兼容,,我們就要確保各個不同版本的類要具有相同的serialVersionUID,;當然,如果你不希望不同版本的類對序列化兼容,,那么不同版本可以具有不同的serialVersionUID,。也就是說,當你序列化一個類實例后,,如果更改了一個字段,,或增加一個字段,,不設置serialVersionUID,所做的任何更改都會導致無法反序列化,,并且在序列化時拋出異常,。如果你增加了serialVersionUID,在反序列化時,,新添加或者更改的字段值將會設置成初始值(對象為null,,其他基礎類型對應相應的初始值),字段被刪除將不設置,。這就是serialVersionUID的作用,。
序列化
對象的序列化是指將對象轉換成字節(jié)序列的過程。
對象的反序列化是指字節(jié)序列轉換成對象的過程,。
在Java網絡編程編程中,,進程間可以發(fā)送各種類型的數據,但無論是那種類型的數據,,在網絡中傳輸都要以二進制序列的形式,,所以發(fā)送方需要把Java對象轉換成字節(jié)序列,;接收方則需要把字節(jié)序列轉化成Java對象,。這個過程中,Java對象轉化成字節(jié)序列的過程稱作為對象的序列化,,把字節(jié)碼恢復成Java對象的過程稱作為Java對象的反序列化,。
對象序列化主要有兩種用途:
1)實現(xiàn)對象在網絡傳輸。
2)實現(xiàn)對象的持久化,,例如:存放到文件,,DB中。
java.io.ObjectOutputStream是Java中的對象輸出流,,writeObject(Object obj)方法可對參數指定的obj對象進行序列化,,把得到的字節(jié)序列寫到一個目標輸出流中。java.io.ObjectInputStream是Java中的對象輸入流,,readObject()方法從一個源輸入流中讀取字節(jié)序列,,再把它們反序列化為一個對象,并將其返回,。
|