標籤:des style blog color io os 使用 ar java
一個對象有對應的一些屬性,把這個對象儲存在硬碟上的過程叫做”持久化”.
把堆記憶體中的對象的生命週期延長,存入硬碟,做持久化操作.當下次再需要這個對象的時候,我們不用new了,直接從硬碟中讀取就可以了.(儲存到硬碟是一個檔案,不需要我們去解析,如果用記事本開啟解析會出現亂碼,解析要用特定的方式,不用我們管. 我們只需要讀取).
把Object Storage Service到硬碟上的一個檔案中,這個檔案的標準副檔名是(.object).
在很多架構中就會有這種.object結尾的檔案,因為很多個物件都不建立,建立起來太麻煩,直接讀取,而且有些對象的值你不知道,架構封存在.object檔案中,直接讀取這個檔案中的這個值就行了,不需要傳這個值.
1 import java.io.Serializable; 2 /* 3 * Serializable:用於給被序列化的類加入ID號。 4 * 用於判斷類和對象是否是同一個版本。 5 */ 6 public class Person implements Serializable/*標記介面*/ { 7 /** 8 * transient:非待用資料不想被序列化可以使用這個關鍵字修飾。 9 */10 private static final long serialVersionUID = 9527l; 11 // private transient String name;12 private String name;13 // private static int age;14 private int age;15 16 public Person(String name, int age) {17 super();18 this.name = name;19 this.age = age;20 }21 public String getName() {22 return name;23 }24 public void setName(String name) {25 this.name = name;26 }27 public int getAge() {28 return age;29 }30 public void setAge(int age) {31 this.age = age;32 }33 }
1 public class ObjectStreamDemo { 2 /** 3 * @param args 4 * @throws IOException 5 * @throws ClassNotFoundException 6 */ 7 public static void main(String[] args) throws IOException, ClassNotFoundException { 8 //writeObj(); 9 readObj();10 }11 public static void readObj() throws IOException, ClassNotFoundException {12 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.object"));13 //對象的還原序列化。 14 Person p = (Person)ois.readObject();15 System.out.println(p.getName()+":"+p.getAge());16 ois.close();17 }18 19 public static void writeObj() throws IOException, IOException {20 21 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object"));22 //對象序列化。 被序列化的對象必須實現Serializable介面。 23 oos.writeObject(new Person("小強",30));24 oos.close();25 }26 }
序號的作用:舉個例子,當你一開始對這個person類進行序列化的時候用的是private類型序列化的,但是你在還原序列化之前,把這個private改成了public.這樣還原序列化讀取的時候就會報出異常.
Exception in thread "main" java.io.InvalidClassException: cn.itcast.serializable.Person; local class incompatible: stream classdesc serialVersionUID = 9527, local class serialVersionUID = 7915096815468332737
就是關於前後這個Person類的版本號碼不統一.如果加上設定一個版本號碼,那麼經過上面的修改也是可以還原序列化的.
@throws ClassNotFoundException
如果只有obj.object 這個檔案能不能把其中的對象Person取出來,因為任何對象在堆記憶體中建立都必須依賴於該對象所屬的類檔案(class檔案),如果僅僅給了obj.object,這個裡面有Person對象的位元組碼,可是取出的時候你記憶體中並沒有Person.class檔案,沒有,所以取不出來,所以必須要有obj.object檔案和Person.class檔案.(所以有一個ClassNotFound異常)
類 ObjectInputStream
ObjectInputStream 對以前使用 ObjectOutputStream 寫入的基本資料和對象進行還原序列化。
這句話的意思就是ObjectInputStream只能讀取ObjectOutputStream的.
ObjectOutputStream 和 ObjectInputStream 分別與 FileOutputStream 和 FileInputStream 一起使用時,可以為應用程式提供對對象圖形的持久儲存。
序列化就是按照順序排列
Serializable就是一個標記,(要想實現序列化必須有這個標記)
對象的預設序列化機制寫入的內容是:對象的類,類簽名,以及非瞬態和非靜態欄位的值。(因為靜態static的東西在方法區.)
使用時候:對某些特點的對象,比如資料庫連接對象,儲存特定資料的對象 ,這樣對象你不想建立他們,想儲存起來,讓他們的生命週期延長,可以把他們放在硬碟當中.每次系統啟動的時候都到.object中讀取對象和裡面的資料,這個時候就可以把他們序列化來完成.
僅僅是把對象從堆記憶體儲存到了硬碟上.
介面 Serializable
序列化運行時使用一個稱為 serialVersionUID 的版本號碼與每個可序列化類別相關聯. 該序號在還原序列化過程中用於驗證序列化對象的寄件者和接收者是否為該對象載入了與序列化相容的類。(當一個對象進行序列化的時候,給該類分配一個id號.這個id號可以用來驗證.你給給我的檔案儲存體的對象和你給我的類到底是不是同一版本的啊….)
這個ID號是根據類的特徵和類的簽名算出來的.為什麼ID號那麼長,是因為為了避免重複.
所以Serializable是給類加上id用的. 用於判斷類和對象是否是同一個版本。
如果可序列化類別未顯式聲明 serialVersionUID,則序列化運行時將基於該類的各個方面計算該類的預設 serialVersionUID 值. 原因是計算預設的 serialVersionUID 對類的詳細資料具有較高的敏感性,根據編譯器實現的不同可能千差萬別,這樣在還原序列化過程中可能會導致意外的 InvalidClassException。
在學web的時候一些類就需要實現序列化介面,因為伺服器就會對你的對象進行臨時本機存放區.它怕伺服器崩了的以後,你的會話都被消失了.所以儲存在了硬碟上,你重新啟動伺服器會恢複之前的會話,恢複對象,你之前啟動並執行東西都在.
關於序列化介面的理解