Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          控制對象的序列化和反序列化

          Posted on 2009-05-24 22:44 啥都寫點 閱讀(239) 評論(0)  編輯  收藏 所屬分類: J2SE
          關鍵技術:
          • 當被序列化的對象實現了java.io.Externalizable接口時,就可以靈活地控制它的序列化和反序列化過程。java.io.Externalizable接口繼承了java.io.Serializable。
          • Externalizable接口定義了兩個接口:writeExternal方法在序列化時被調用,可以在該方法中控制序列化的內容;readExternal方法在反序列化時被調用,可以在該方法中控制反序列化的內容。

          package book.io;

          import java.io.Externalizable;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.ObjectInput;
          import java.io.ObjectInputStream;
          import java.io.ObjectOutput;
          import java.io.ObjectOutputStream;
          import java.util.Date;

          /**
           * 控制序列化就是有選擇的序列化對象,而不是把所有對象的一切內容進行序列化。
           * SerializeObject演示了使用transit關鍵字可以控制變量不被序列化。
           * 本程序將演示通過實現Externalizable接口控制對象的序列化和反序列化。
           
          */
          public class SerializeControl {
              
          /**
               * 內部類,用于測試控制對象的序列化和反序列化。
               * 被序列化的對象必須實現Externalizable接口,該接口有2個方法:
               * writeExternal方法、readExternal方法。
               * 當序列化對象的時候,writeExternal方法會自動執行,所有的對象寫入操作由該方法控制。
               * 反序列化對象的時候,readExternal方法會自動執行,如果想訪問writeExternal寫入的內容,
               * 也只能在該方法里編寫恢復對象的代碼。
               
          */
              
          static class MyClassControl implements Externalizable{
                   
          int serialClassInt;
                   
          int a=3, b=4;
                   
          public MyClassControl(){
                       System.out.println(
          "MyClass constructor!");
                       
          this.serialClassInt = 9;
                   }
                   
                   
          public void show(){
                       System.out.println(
          "serialClassInt: " + serialClassInt);
                   }
                  
          //當序列化對象的時候,該方法自動被調用
                  public void writeExternal(ObjectOutput out) throws IOException{
                      System.out.println(
          "run writeExternal");
                      
          //可以在序列化時寫非自身的變量,
                      Date d = new Date();
                      out.writeObject(d);
                      
          //只序列化serialClassInt變量,a、b兩個變量不被序列化
                      out.writeInt(this.serialClassInt);        
                  }
                  
          // 當反序列化對象的時候, 該方法自動被調用
                  public void readExternal(ObjectInput in) throws IOException,
                          ClassNotFoundException {
                      System.out.println(
          "run readExternal");
                      Date d 
          = (Date) in.readObject();
                      System.out.println(d);
                      
          this.serialClassInt = in.readInt();
                  } 
              }
              
          /**
               * 序列化對象
               
          */
              
          public static void serializable(String fileName) throws Exception{
                  ObjectOutputStream out 
          = new ObjectOutputStream(new FileOutputStream(fileName));
                  MyClassControl my1 
          = new MyClassControl();
                  out.writeObject(my1);
                  out.close();        
              }
              
          /**
               * 反序列化
               
          */
              
          public static void deserializable(String fileName)throws Exception{
                  ObjectInputStream in 
          = new ObjectInputStream(new FileInputStream(fileName));
                  MyClassControl my2 
          = (MyClassControl)in.readObject();
                  my2.show();
                  in.close();
              }

              
          public static void main(String[] args) throws Exception{
                  String fileName 
          = "c:/temp/MyClassControl.ser";
                  SerializeControl.serializable(fileName);
                  SerializeControl.deserializable(fileName);
              }
          }



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 鹤山市| 孟州市| 晋江市| 巴马| 怀柔区| 稷山县| 龙江县| 呈贡县| 昌乐县| 红桥区| 灌云县| 平乐县| 岚皋县| 丽江市| 盖州市| 聊城市| 南投市| 塔河县| 荆州市| 缙云县| 黔江区| 榕江县| 康马县| 内江市| 沅江市| 大足县| 庐江县| 阿瓦提县| 东城区| 昌平区| 都江堰市| 长葛市| 介休市| 托里县| 山东省| 东兴市| 昌都县| 霞浦县| 嘉鱼县| 贞丰县| 威远县|