JAVA語言序列化和反序列化一目瞭然(二)加深

本文來自http://renyanwei.iteye.com/blog/257754

控制序列化就是有選擇的序列化對象,而不是把對象的所以內容都序列化,前篇我們的例子中介紹了transit變量和類變量(static)不被序列化,現在我們還有一種更爲靈活的控制對象序列化和反序列方法,可以在序列化過程中儲存其他非this對象包含的數據

 

我們現在再來介紹一個接口 java.io.Externalizable 。當對象實現了這個接口時,就可以靈活的控制它的序列化和反序列過程,這個接口繼承了java.io.Serializable

 

Externalizable 接口定義了兩個方法,writerExternal方法在序列化時被調用,可以再該方法中控制序列化內容,readExternal方法在反序列時被調用,可以在該方法中控制反序列的內容

 

好了,現在我們改寫上例的UserInfo

import java.io.*;
import java.util.*;

//本程序通過實現Externalizable接口控制對象序列化和反序列
public class UserInfo implements Externalizable {
	public String userName;
	public String userPass;
	public int userAge;

	public UserInfo(){
	}

	public UserInfo(String username,String userpass,int userage){
		this.userName=username;
		this.userPass=userpass;
		this.userAge=userage;
	}
	
	//當序列化對象時,該方法自動調用
	public void writeExternal(ObjectOutput out) throws IOException{
		System.out.println("現在執行序列化方法");
		//可以在序列化時寫非自身的變量
		Date d=new Date();
		out.writeObject(d);
		//只序列化userName,userPass變量
		out.writeObject(userName);
		out.writeObject(userPass);
	}

	//當反序列化對象時,該方法自動調用
	public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{
		System.out.println("現在執行反序列化方法");
		Date d=(Date)in.readObject();
		System.out.println(d);
		this.userName=(String)in.readObject();
		this.userPass=(String)in.readObject();
	}

	public String toString(){
		return "用戶名: "+this.userName+";密碼:"+this.userPass+
			";年齡:"+this.userAge;
	}
}

改寫測試類

import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;
import java.lang.management.*;
public class Test {



	//序列化對象到文件
	public static void serialize(String fileName){
		try
		{
			//創建一個對象輸出流,講對象輸出到文件
			ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));

			UserInfo user=new UserInfo("renyanwei","888888",20);
			out.writeObject(user);	//序列化一個會員對象

			out.close();
		}
		catch (Exception x)
		{
			System.out.println(x.toString());
		}
		
	}
	//從文件反序列化到對象
	public static void deserialize(String fileName){
		try
		{
			//創建一個對象輸入流,從文件讀取對象
			ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));

			//讀取UserInfo對象並調用它的toString()方法
			UserInfo user=(UserInfo)(in.readObject());			
			System.out.println(user.toString());

			in.close();
		}
		catch (Exception x)
		{
			System.out.println(x.toString());
		}
		
	}

	public static void main(String[] args) {	

		serialize("D:\\test.txt");
		System.out.println("序列化完畢");
		
		deserialize("D:\\test.txt");
		System.out.println("反序列化完畢");
	}

}

現在執行序列化方法
序列化完畢
現在執行反序列化方法
Thu Oct 23 22:18:12 CST 2008
用戶名: renyanwei;密碼:888888;年齡:0
反序列化完畢

 

通過一張圖來看程序流程

首先,我們在序列化UserInfo對象的時候,由於這個類實現了Externalizable 接口,在writeExternal()方法裏定義了哪些屬性可以序列化,哪些不可以序列化,所以,對象在經過這裏就把規定能被序列化的序列化保存文件,不能序列化的不處理,然後在反序列的時候自動調用readExternal()方法,根據序列順序挨個讀取進行反序列,並自動封裝成對象返回,然後在測試類接收,就完成了反序列

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

最後再次感謝原作者

有關序列化的高級用法,參考:http://www.ibm.com/developerworks/cn/java/j-lo-serial/#iratings

發佈了19 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章