Java序列化是指把Java對象保存為二進制字節(jié)碼的過程雀哨,Java反序列化是指把二進制碼重新轉換成Java對象的過程。一般的要實現Java對象序列化就需要實現Serializbale 接口夭拌。
那么為什么需要序列化呢不翩?
- 第一種情況是:一般情況下Java對象的聲明周期都比Java虛擬機的要短,實際應用中我們希望在JVM停止運行之后能夠持久化指定的對象,這時候就需要把對象進行序列化之后保存肛循。
- 第二種情況是:需要把Java對象通過網絡進行傳輸的時候。因為數據只能夠以二進制的形式在網絡中進行傳輸银择,因此當把對象通過網絡發(fā)送出去之前需要先序列化成二進制數據多糠,在接收端讀到二進制數據之后反序列化成Java對象。
一個簡單的序列化示例:
public class SerializableTest {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
TestObject testObject = new TestObject();
oos.writeObject(testObject);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream ois = new ObjectInputStream(fis);
TestObject deTest = (TestObject) ois.readObject();
System.out.println(deTest.testValue);
System.out.println(deTest.parentValue);
System.out.println(deTest.innerObject.innerValue);
}
}
class Parent implements Serializable {
private static final long serialVersionUID = -4963266899668807475L;
public int parentValue = 100;
}
class InnerObject implements Serializable {
private static final long serialVersionUID = 5704957411985783570L;
public int innerValue = 200;
}
class TestObject extends Parent implements Serializable {
private static final long serialVersionUID = -3186721026267206914L;
public int testValue = 300;
public InnerObject innerObject = new InnerObject();
}
注意點:
- 如果一個類想被序列化浩考,需要實現Serializable接口夹孔。否則將拋出NotSerializableException異常,這是因為,在序列化操作過程中會對類型進行檢查搭伤,要求被序列化的類必須屬于Enum只怎、Array和Serializable類型其中的任何一種。
- 通過ObjectOutputStream和ObjectInputStream對對象進行序列化及反序列化
- 序列化并不保存靜態(tài)變量
- Transient 關鍵字的作用是控制變量的序列化怜俐,在變量聲明前加上該關鍵字身堡,可以阻止該變量被序列化到文件中,在被反序列化后拍鲤,transient 變量的值被設為初始值贴谎,如 int 型的是 0,對象型的是 null