詳解Java中對象序列化與反序列化。本站提示廣大學習愛好者:(詳解Java中對象序列化與反序列化)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中對象序列化與反序列化正文
序列化 (Serialization)是將對象的狀況信息轉換為可以存儲或傳輸的情勢的進程。普通將一個對象存儲至一個貯存序言,例如檔案或是記億體緩沖等。在收集傳輸進程中,可所以字節或是XML等格局。而字節的或XML編碼格局可以復原完整相等的對象。這個相反的進程又稱為反序列化。
Java對象的序列化與反序列化
在Java中,我們可以經由過程多種方法來創立對象,而且只需對象沒有被收受接管我們都可以復用該對象。然則,我們創立出來的這些Java對象都是存在於JVM的堆內存中的。只要JVM處於運轉狀況的時刻,這些對象才能夠存在。一旦JVM停滯運轉,這些對象的狀況也就隨之而喪失了。
然則在真實的運用場景中,我們須要將這些對象耐久化上去,而且可以或許在須要的時刻把對象從新讀掏出來。Java的對象序列化可以贊助我們完成該功效。
對象序列化機制(object serialization)是Java說話內建的一種對象耐久化方法,經由過程對象序列化,可以把對象的狀況保留為字節數組,而且可以在有須要的時刻將這個字節數組經由過程反序列化的方法再轉換成對象。對象序列化可以很輕易的在JVM中的運動對象和字節數組(流)之間停止轉換。
在Java中,對象的序列化與反序列化被普遍運用到RMI(長途辦法挪用)及收集傳輸中。
相干接口及類
Java為了便利開辟人員將Java對象停止序列化及反序列化供給了一套便利的API來支撐。個中包含以下接口和類:
類經由過程完成 java.io.Serializable 接口以啟用其序列化功效。未完成此接口的類將沒法使其任何狀況序列化或反序列化。可序列化類的一切子類型自己都是可序列化的。序列化接口沒無方法或字段,僅用於標識可序列化的語義。 (該接口並沒無方法和字段,為何只要完成了該接口的類的對象能力被序列化呢?)
當試圖對一個對象停止序列化的時刻,假如碰到不支撐 Serializable 接口的對象。在此情形下,將拋出NotSerializableException。
假如要序列化的類有父類,要想同時將在父類中界說過的變量耐久化上去,那末父類也應當集成java.io.Serializable接口。
上面是一個完成了java.io.Serializable接口的類
package com.hollischaung.serialization.SerializableDemos; import java.io.Serializable; /** * Created by hollis on 16/2/17. * 完成Serializable接口 */ public class User1 implements Serializable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
經由過程上面的代碼停止序列化及反序列化
package com.hollischaung.serialization.SerializableDemos; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.*; /** * Created by hollis on 16/2/17. * SerializableDemo1 聯合SerializableDemo2解釋 一個類要想被序列化必需完成Serializable接口 */ public class SerializableDemo1 { public static void main(String[] args) { //Initializes The Object User1 user = new User1(); user.setName("hollis"); user.setAge(23); System.out.println(user); //Write Obj to File ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("tempFile")); oos.writeObject(user); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(oos); } //Read Obj from File File file = new File("tempFile"); ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(file)); User1 newUser = (User1) ois.readObject(); System.out.println(newUser); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(ois); try { FileUtils.forceDelete(file); } catch (IOException e) { e.printStackTrace(); } } } } //OutPut: //User{name='hollis', age=23} //User{name='hollis', age=23}
以上就是本文的全體內容,願望對年夜家進修Java中對象序列化與反序列化有所贊助。