【java基礎知識】【java序列化與反序列化及序列化ID】

今天上午學習了java序列化與反序列化及serialVersionUID的用處。java

1、序列化與反序列化的做用:編程

對象的序列化主要有兩種用途:
1) 把對象的字節序列永久地保存到硬盤上,一般存放在一個文件中;
2) 在網絡上傳送對象的字節序列。網絡

 

由於不對對象序列化的化容易出現不少問題,因此引入了序列化解決了這些問題。學習

 

對象序列化包括以下步驟:
1) 建立一個對象輸出流,它能夠包裝一個其餘類型的目標輸出流,如文件輸出流;
2) 經過對象輸出流的writeObject()方法寫對象。
對象反序列化的步驟以下:
1) 建立一個對象輸入流,它能夠包裝一個其餘類型的源輸入流,如文件輸入流;
2) 經過對象輸入流的readObject()方法讀取對象。
下面讓咱們來看一個對應的例子,類的內容以下:spa

 

 

2、serialVersionUID做用: 
       序列化時爲了保持版本的兼容性,即在版本升級時反序列化仍保持對象的惟一性。
有兩種生成方式:
       一個是默認的1L,好比:private static final long serialVersionUID = 1L;
       一個是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段,好比:
       private static final   long     serialVersionUID = xxxxL;

當你一個類實現了Serializable接口,若是沒有定義serialVersionUID,Eclipse會提供這個提示功能告訴你去定義 。對象

 

養成良好編程習慣,Java UID最好顯式聲明。

 

只要任何類別實現了Serializable這個接口的話,若是沒有加入serialVersionUID,Eclipse都會給你warning提示,這個serialVersionUID爲了讓該類別Serializable向後兼容。 

若是你的類Serialized存到硬盤上面後,但是後來你卻更改了類別的field(增長或減小或更名),當你Deserialize時,就會出現Exception的,這樣就會形成不兼容性的問題。 

但當serialVersionUID相同時,它就會將不同的field以type的預設值Deserialize,可避開不兼容性問題。
接口

相關文章
相關標籤/搜索