今天看了Java編程思想序列化的那一節,明白了Java中序列化的究竟是個什麼事情,主要用來做什麼,相對於其他具有相同功能的操作有什麼不同。
現在就來總結一下。
名詞介紹:何爲序列化與反序列化。我們知道但我們創建一個對象時,一旦程序終止之後,這個對象就不會繼續存在了。但是存在某些情況下,在
程序不運行的情況下,仍然能夠保存這個對象的信息,這樣在程序下次運行時,該對象將被重建並且用於與上次運行時相同的信息。我們將這個對
象保存下來的過程就稱爲序列化,反之將這個對象進行重建並獲取相同的信息的過程就稱之爲反序列化。
Java對象序列化就是通過Serializable接口將對象轉換成字節序列然後保存起來,然後讀取這個字節序列並完全恢復爲原來的對象。它彌補了不同操
作系統之間的差異,能夠在不同的操作系統之間進行序列化然後反序列化。它是一個輕量級的持久性。爲什麼稱之爲輕量級,是因爲在Java中沒有
相對應的關鍵字來簡單定義一個序列化對象,必須顯示的進行序列化和反序列化。
作用:Java中加入序列化的概念主要是爲了支持兩種主要特性,1、java遠程方法調用(Remote Method Invocation) 2、在Java Bean中保存狀態的
配置信息。在android中的框架層也用到了Java的序列化特性,如:Activity之間的數據傳遞就可以通過序列化對象來進行傳遞,aidl數據傳遞等等
但是android更建議使用Parcelable,因爲在android中Parcelable比Serializable效率更高,內存佔用更小。具體可以參考下面這篇博文:
http://www.cnblogs.com/fwycmengsoft/archive/2011/11/10/2244459.html。
具體使用方式:
一 實現Serializable接口
public class MyData implements Serializable{
private int num;
public MyData(int num){
this.num = num;
}
public String getNum(){
return Integer.toString(num);
}
}
二、序列化以及反序列化
public class MyTest implements Serializable{
public String str = null;
public MyTest(String str){
this.str = str;
}
public static void main(String[] args) {
MyTest test = new MyTest("Serializable");
System.out.println("序列化之前:"+test.getStr());
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.out"));
out.writeObject(test);
out.flush();
out.close();
ObjectInputStream input = new ObjectInputStream(new FileInputStream("test.out"));
MyTest myTest = (MyTest)input.readObject();
System.out.println("序列化之後:"+myTest.str);
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
如果你的程序中有一些關鍵信息不想被持久化(序列化)那麼可以通過關鍵字transient來定義該變量,如:密碼之類的不想被持久化,就能夠通過這
個關鍵字關閉序列化,他的意思就是:不用你進行數據保存和恢復。
結果:序列化之前:Serializable 序列化之後:Serializable。
那麼Java中還有那些方式能夠達到序列化的效果(數據持久化)?在java中還能夠通過XML的方式來將數據持久化,通過將數據轉化爲XML格式,然後
進行保存以及讀取。除了XML格式還有Preferences方式,與對象序列化相比較,Preference 只能存儲基本類型和字符串。並且每個字符串的長度不
能超過8K。他的作用主要用來存儲程序的用戶配置信息。