1、序列化是干什么的?
簡單說就是為了保存在內存中的各種對象的狀態(也就是實例變量,不是方法),并且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保 存object states,但是Java給你提供一種應該比你自己好的保存對象狀態的機制,那就是序列化。
2.什么是反序列化
和上面相反,就是把object states轉換為各種對象狀態
3、什么情況下需要序列化
a)當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候。(大家可以看看String類,肯定是會implements java.io.Serializable)
b)當你想用套接字在網絡上傳送對象的時候;
c)當你想通過RMI傳輸對象的時候、
3、相關注意事項
a)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable接口
b)序列化時,只對對象的狀態進行保存,而不管對象的方法
c)對于關鍵詞transient,表示一個域不會被序列化。舉例說明
public class Ca implements Serializable {
private static final long serialVersionUID = 2161216686162584206L;
int a;
transient String b;
Ca(int a,String b){
this.a=a;
this.b=b;
}
public String toString(){
return "a = "+a+",b = "+b;
}
}
在另外類中調用toString方法。
Ca a = new Ca(1,"test");
System.out.println(a);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:\\test.out"));
oos.writeObject(a);
oos.reset();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:\\test.out"));
a = (Ca)ois.readObject();
System.out.println(a);
如果 transient String b;這樣出來的效果是
a = 1,b = test
a = 1,b = null
去掉的話
a = 1,b = test
a = 1,b = test
這樣就可以知道transient在反序列化的時候不能得到值,因為寫入的時候就沒有被序列化
d)
serialVersionUID 用來表明類的不同版本間的兼容性。如果你修改了此類, 要修改此值。否則以前用老版本的類序列化的類恢復時會出錯.
在JDK中,可以利用JDK的bin目錄下的serialver.exe工具產生這個serialVersionUID,對于Test.class,執行命令:serialver Test。
在項目中建議大家不要改serialVersionUID 這個值。,特別是要用的緩存。一旦serialVersionUID被改變,舊有的序列化對象就不能被被反序列化了,會拋出如下異常:
java.io.InvalidClassException: MyObject; local class incompatible: stream classdesc serialVersionUID = a, local class serialVersionUID = b
posted on 2010-08-24 10:57
青菜貓(孫宇) 閱讀(291)
評論(0) 編輯 收藏 所屬分類:
java