將記憶體中的物件寫入到硬碟中就是序列化,與一般輸出並無區別,只是輸出的資料是對象,不是一般的文字。
因為資料在記憶體中的儲存是暫時的,如果需要長久保存對象,必須把對象寫入硬碟,就產生了序列化。
一個物件要想被序號,該物件所屬的類別必須實作Serializable接口,該接口是一個標誌性接口,無任何字段與抽象方法,JVM遇到該接口將為該類別分配一個序列化版本號。
4.一個物件被序列化,該物件中的全域變數包含private類型的變數都會被寫入硬碟。
#靜態欄位不能被序列化,靜態變數的值是目前JVM中的值,不是序列化時所設定的值。
被transient修飾的欄位不能被序列化。
OutputStream ops=new FileOuptStream(path); ObjectOuptStream oos=new ObjectOutputStream(ops); Object obj=new Ojbect(); oos.writeObject(obj);
#反序列化就是將硬碟中的資料寫入內存,取得保存在文件中的物件。
反序列化的順序必須與序列化的順序一致。
⑴序列化時會產生一個long類別數字,並稱為序列化版本號,同時儲存在序列化文件與類別文件中,反序列化時對比兩個數字,如果相同,則序列化成功;不相同,則無法反序列化。
⑵序列化版本號用來標註實體類別的版本,實體類別一旦修改,如果未明確地指定序列化版本號,系統自動生成一個新的版本號,這樣兩個版本號不同,無法序列化。 一般在需要序列化的實體類別中明確地設定序列化版本號。
⑶不是重新編譯不一定會產生一個新的序列化版本號,只有實體類別發生了改變才會產生新的序列化版本號。
反序列化時首先對比序列化檔案與類別檔案中的序列化版本號是否相同,如果相同,表明該序列化文件是由當前類文件生成的,可以反序列哈;不相同,表示不是由當前類文件生成的,版本不一致,無法反序列化。
InputStream is=new FileInputStream(path); ObjectInputStream ois=new ObjectIputStream(is); Object obj=ois.readObject();
以上是什麼是序列化?序列化的具體介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!