最近在深入學習一些框架,其中有一部分的工作原理就是對象的序列化和反序列化。下面簡單介紹一下什麼是序列化。
Java平臺允許我們在內存中創建可複用的Java對象,但一般情況下,只有當JVM處於運行時,這些對象纔可能存在,這些對象的生命週期不會比JVM的生命週期更長。
但在現實應用中,就可能要求在JVM停止運行之後能夠保存(持久化)指定的對象,並在將來重新讀取被保存的對象。Java對象序列化就能夠幫助我們實現該功能。
使用Java對象序列化,在保存對象時,會把其狀態保存爲一組字節,在未來,再將這些字節組裝成對象。必須注意地是,對象序列化保存的是對象的”狀態”,即它的成員變量。由此可知,對象序列化不會關注類中的靜態變量。
除了在持久化對象時會用到對象序列化之外,當使用RMI(遠程方法調用),或在網絡中傳遞對象時,都會用到對象序列化。
下面舉個例子:
首先寫一個枚舉類 ,枚舉大家都知道是可以被實例化的,和實現了serializable接口的實體類,重寫實體類的tostring()方法。
public enum Classes {
ONE,TWO,THREE
}
import java.io.Serializable;
public class Student implements Serializable{
private String name;
private Classes classes;
private int age;
public Student(String name, Classes classes, int age) {
this.name = name;
this.classes = classes;
this.age = age;
}
@Override
public String toString() {
return "[" + name + "," +
classes + "," +
age +
"]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Classes getClasses() {
return classes;
}
public void setClasses(Classes classes) {
this.classes = classes;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
輸出結果爲
[asd,ONE,23]
這裏用到了對象流,通過源碼可知如果被寫對象類型是數組,enum,String,以及實現了Serializable接口,就可以實例化,否則拋出NoSerializableException異常。
注意:
1.當某個字段被聲明爲transient時該字段不會被序列化。
2.使用序列化接口Externalizable,之前基於Serializable接口的序列化機制將會失效。