Cyh的博客

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

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

Posted on 2009-05-24 22:44 啥都写点 阅读(222) 评论(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);
    }
}



                                                                                                       --    学海无涯
        


只有注册用户登录后才能发表评论。


网站导航: