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
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 | 31 | 1 | 2 | 3 | 4 |
青菜貓(孫宇)結交天下朋友,在網上吸取知識..
常用鏈接
留言簿(16)
隨筆分類
隨筆檔案
- 2013年6月 (1)
- 2013年5月 (1)
- 2011年6月 (1)
- 2010年11月 (1)
- 2010年9月 (3)
- 2010年8月 (1)
- 2010年7月 (1)
- 2010年5月 (3)
- 2009年9月 (1)
- 2008年8月 (2)
- 2008年6月 (2)
- 2008年4月 (1)
- 2007年12月 (1)
- 2007年11月 (1)
- 2007年10月 (9)
文章分類
搜索
最新評論

- 1.?re: java反射 修改靜態方法的值 setAccessible太無節操了
-
@江奕銘
寫的真受用。見識了 - --宋大傻
- 2.?re: java反射 修改靜態方法的值 setAccessible太無節操了
- 這文章寫的好!
- --江奕銘
- 3.?re: java反射 修改靜態方法的值 setAccessible太無節操了
- 這么些會個屁的
- --BBB
- 4.?re: java反射 修改靜態方法的值 setAccessible太無節操了
- jvm 加上安全管理期及相關策略即可防止。
- --zzy8811
- 5.?re: java解析電話薄 VCF文件ENCODING=QUOTED-PRINTABLE編碼
-
太感謝了!!! ~~~~(>_<)~~~~
哥已經轉換出來了。 - --ingyk