今天上午學習了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會提供這個提示功能告訴你去定義 。對象
只要任何類別實現了Serializable這個接口的話,若是沒有加入serialVersionUID,Eclipse都會給你warning提示,這個serialVersionUID爲了讓該類別Serializable向後兼容。
若是你的類Serialized存到硬盤上面後,但是後來你卻更改了類別的field(增長或減小或更名),當你Deserialize時,就會出現Exception的,這樣就會形成不兼容性的問題。
但當serialVersionUID相同時,它就會將不同的field以type的預設值Deserialize,可避開不兼容性問題。接口