Java串行化問題

串行化(serialization)是指將一個對象的當前狀態轉換成字節流(a stream of bytes)的過程,而反串行化(deserialization)則指串行化過程的逆過程,將字節流轉換成一個對象,打回原形
一、串行化的意義:
1:解決Web應用程序的無狀態弊端
一旦將某一對象串行化,得到的字節可以存儲在文件、數據庫,或內存中—— 只要是可以存儲的任何地方。需要恢復對象時,僅僅只需從它存儲的位置反串行化即可。對象固有的這種特性對於無狀態的Web應用程序是非常重要的,因爲它允許重要的狀態信息可以在用戶請求之間保留。
2:應用程序邊界之間傳遞對象
串行化也允許對象在應用程序邊界之間傳遞,編程人員可以將描述對象狀態的字節流在網絡上傳遞,並在另一端反串行化成一個匹配的對象。從本質上講,串行化允許對象以“數值”的方式傳遞給另一個應用程序。
二:串行化對象
在java中串行化對象必須:
1、該對象的類必須實現Serializable接口
2、該對象的串行化成員必須是非靜態成員變量,即不能保存任何的成員方法和靜態的成員變量,而且串行化保存的只是變量的值,對於變量的任何修飾符,都不能保存。而對於某些類型的對象,其狀態是瞬時的,這樣的對象是無法保存其狀態的,例如一個Thread對象,或一個FileInputStream對象,對於這些字段,我們必須用transient關鍵字標明 。
注:保存任何的成員方法和靜態的成員變量沒有任何的意義,因爲,對象的類已經完整的保存了他們,如果再串行化他們還有什麼意義呢?呵呵
3、要串行化一個對象,必須與一定的對象輸入/輸出流聯繫起來,通過對象輸出流將對象狀態保存下來,再通過對象輸入流將對象狀態恢復。
三:具體實現
1、串行化的對象:Person類
Java代碼
  1. import java.io.Serializable;   
  2. /*    
  3.  * time:2008-07-19    
  4.  * author:coke    
  5.  */    
  6.   
  7. /*  
  8.  *必須實現Serializable   
  9.  */  
  10. public class Person implements Serializable {   
  11.     private static final long serialVersionUID = 1L;   
  12.     private int age; // will persist   
  13.     private String name; // will persist   
  14.     // transient 爲Java保留字,告訴JVM以transient宣告的基本型態(primitive type)或物   
  15.     // 件(object)變量不要序列化,例如敏感性數據像是密碼等。   
  16.     private transient String pwd; // will not persist   
  17.     public Person() {   
  18.     }   
  19.   
  20.     public Person(int age, String name,String pwd) {   
  21.         this.age = age;   
  22.         this.name = name;   
  23.         this.pwd=pwd;   
  24.     }   
  25.   
  26.     public int getAge() {   
  27.         return age;   
  28.     }   
  29.   
  30.     public void setAge(int age) {   
  31.         this.age = age;   
  32.     }   
  33.   
  34.     public String getName() {   
  35.         return name;   
  36.     }   
  37.   
  38.     public void setName(String name) {   
  39.         this.name = name;   
  40.     }   
  41.   
  42.     public String getPwd() {   
  43.         return pwd;   
  44.     }   
  45.   
  46.     public void setPwd(String pwd) {   
  47.         this.pwd = pwd;   
  48.     }   
  49. }  
import java.io.Serializable;
/*  
 * time:2008-07-19  
 * author:coke  
 */ 

/*
 *必須實現Serializable 
 */
public class Person implements Serializable {
	private static final long serialVersionUID = 1L;
	private int age; // will persist
	private String name; // will persist
	// transient 爲Java保留字,告訴JVM以transient宣告的基本型態(primitive type)或物
	// 件(object)變量不要序列化,例如敏感性數據像是密碼等。
	private transient String pwd; // will not persist
	public Person() {
	}

	public Person(int age, String name,String pwd) {
		this.age = age;
		this.name = name;
		this.pwd=pwd;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

2、串行化和反串行化
Java代碼 複製代碼 收藏代碼
  1. import java.io.FileNotFoundException;   
  2. import java.io.IOException;   
  3. import java.io.ObjectInputStream;   
  4. import java.io.ObjectOutputStream;   
  5. import java.io.FileInputStream;   
  6. import java.io.FileOutputStream;   
  7. import java.io.File;   
  8. /*  
  9.  * time:2008-07-19  
  10.  * author:coke  
  11.  */  
  12. public class TestSerializable {   
  13.     private static File f = null;   
  14.   
  15.     //串行化   
  16.     public static void serialization() {   
  17.         f = new File("D://t.m");   
  18.         try {   
  19.             if (f.exists())   
  20.                 f.delete();   
  21.             f.createNewFile();   
  22.   
  23.         } catch (IOException e1) {   
  24.             // TODO Auto-generated catch block   
  25.             e1.printStackTrace();   
  26.         }   
  27.         Person p = new Person(10"xplq""123456");   
  28.         try {   
  29.             ObjectOutputStream out = new ObjectOutputStream(   
  30.                     new FileOutputStream(f));   
  31.             out.writeObject(p);   
  32.         } catch (FileNotFoundException e) {   
  33.             e.printStackTrace();   
  34.         } catch (IOException e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.     }   
  38.     //反串行化   
  39.     public static void deserialization() {   
  40.         if (!f.exists())   
  41.             return;   
  42.         try {   
  43.             ObjectInputStream input = new ObjectInputStream(   
  44.                     new FileInputStream(f.getPath()));   
  45.             try {   
  46.                 Person p = (Person) input.readObject();   
  47.                 System.out.println(p.getName());   
  48.                 System.out.println(p.getAge());   
  49.                 System.out.println(p.getPwd());   
  50.             } catch (ClassNotFoundException e) {   
  51.                 // TODO Auto-generated catch block   
  52.                 e.printStackTrace();   
  53.             }   
  54.         } catch (FileNotFoundException e) {   
  55.             // TODO Auto-generated catch block   
  56.             e.printStackTrace();   
  57.         } catch (IOException e) {   
  58.             // TODO Auto-generated catch block   
  59.             e.printStackTrace();   
  60.         }   
  61.     }   
  62.     //測試   
  63.     public static void main(String[] args) {   
  64.         TestSerializable.serialization();   
  65.         TestSerializable.deserialization();   
  66.     }   
  67.   
  68. }  
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
 * time:2008-07-19
 * author:coke
 */
public class TestSerializable {
	private static File f = null;

	//串行化
	public static void serialization() {
		f = new File("D://t.m");
		try {
			if (f.exists())
				f.delete();
			f.createNewFile();

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Person p = new Person(10, "xplq", "123456");
		try {
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(f));
			out.writeObject(p);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//反串行化
	public static void deserialization() {
		if (!f.exists())
			return;
		try {
			ObjectInputStream input = new ObjectInputStream(
					new FileInputStream(f.getPath()));
			try {
				Person p = (Person) input.readObject();
				System.out.println(p.getName());
				System.out.println(p.getAge());
				System.out.println(p.getPwd());
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//測試
	public static void main(String[] args) {
		TestSerializable.serialization();
		TestSerializable.deserialization();
	}

}

3.測試結果
xplq
10
null
因爲pwd transient ,不能被串行化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章