青菜貓(孫宇博客),青菜貓(孫宇博客),青菜貓(孫宇博客)http://www.javasdc.cn/
          posts - 29,  comments - 63,  trackbacks - 0
          1、序列化是干什么的?
          簡單說就是為了保存在內(nèi)存中的各種對象的狀態(tài)(也就是實例變量,不是方法),并且可以把保存的對象狀態(tài)再讀出來。雖然你可以用你自己的各種各樣的方法來保 存object states,但是Java給你提供一種應(yīng)該比你自己好的保存對象狀態(tài)的機制,那就是序列化。
          2.什么是反序列化
          和上面相反,就是把object states轉(zhuǎn)換為各種對象狀態(tài)
          3、什么情況下需要序列化
          a)當你想把的內(nèi)存中的對象狀態(tài)保存到一個文件中或者數(shù)據(jù)庫中時候。(大家可以看看String類,肯定是會implements java.io.Serializable)
          b)當你想用套接字在網(wǎng)絡(luò)上傳送對象的時候;
          c)當你想通過RMI傳輸對象的時候、
          3、相關(guān)注意事項
          a)當一個父類實現(xiàn)序列化,子類自動實現(xiàn)序列化,不需要顯式實現(xiàn)Serializable接口
          b)序列化時,只對對象的狀態(tài)進行保存,而不管對象的方法
          c)對于關(guān)鍵詞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;
              }

          }

          在另外類中調(diào)用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   用來表明類的不同版本間的兼容性。如果你修改了此類,   要修改此值。否則以前用老版本的類序列化的類恢復(fù)時會出錯.
           在JDK中,可以利用JDK的bin目錄下的serialver.exe工具產(chǎn)生這個serialVersionUID,對于Test.class,執(zhí)行命令: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 青菜貓(孫宇) 閱讀(304) 評論(0)  編輯  收藏 所屬分類: java
          <2010年8月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          青菜貓(孫宇)結(jié)交天下朋友,在網(wǎng)上吸取知識..

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          青菜貓(孫宇博客),青菜貓(孫宇博客),青菜貓(孫宇博客)http://www.javasdc.cn/
          主站蜘蛛池模板: 迁安市| 墨玉县| 怀来县| 桃源县| 玉树县| 木兰县| 定陶县| 永平县| 洛隆县| 浪卡子县| 四平市| 桐柏县| 墨竹工卡县| 永济市| 泰兴市| 额济纳旗| 高碑店市| 孙吴县| 香河县| 门头沟区| 大埔区| 年辖:市辖区| 临泽县| 如东县| 二手房| 潞西市| 临汾市| 习水县| 台湾省| 绥化市| 红安县| 榆林市| 呼伦贝尔市| 南雄市| 长海县| 诸城市| 崇仁县| 将乐县| 密山市| 五常市| 芦溪县|