Java對象序列化與反序列化操作紀要

package cn.serializable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 今天整理以下關於Java的對象序列化相關的問題:
 * 
 * [ObjectOutputStream,ObjectInputStream]
 * 
 * 
 * 序列化:
 * 	是指將對象以字節序列的方式表示;其中包括對象的數據,對象的類型,對象中存儲的屬性;
 * 當字節序列寫出到文件中後相當於把對象持久化了;以上便是Java對象的序列化;
 * 
 * 反序列化:
 * 	是指將字節序列從文件中讀取出來的重構對象的方式;
 * 
 * 其中:
 * 序列化的對象需要滿足兩個先決條件:
 * 	1. 該類必須實現java.io.Serializable接口;
 * 	2. 該類中的所有屬性必須是可序列化的;
 * 如果有不需要序列化的屬性可以用transient標記對應的屬性;
 * 
 * 接下來還開始相關的隨筆;
 * 
 * 還是同以往一樣,創建一個自己的測試類;
 * @author Administrator
 *
 */
public class SerializableTest {

	/**
	 * Java程序的入口|主函數;
	 * @param args
	 */
	public static void main(String[] args) {
		
		// 初始化一個文件流路徑;
		String path = "D://user.txt";
		
		// 實例化一個自己的Users類;
		Users user = new Users();
		
		// 初始化一個空的Users對象;
		Users userRead = null;
		
		/**
		 *  對象賦值;
		 *  當前爲私有方式,故而需set賦值;
		 *  普通公共訪問權限直接引用對象.就可以得到;
		 */
		user.setNAME("Liu .....");
		user.setPS("wcadmin");
		user.setAGE(110);
		user.setID_CARD("622222222111114448");
		
		try {
			
			/**
			 * 序列化;
			 * 
			 * 指定序列化地址,實例化ObjectOutputStream序列化對象;
			 */
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
			
			// 指定對象的進行序列化;
			oos.writeObject(user);
			
			// 資源釋放;
			oos.close();
			
			/**
			 * 反序列化;
			 * 指定序列化地址,實例化ObjectInputStream反序列化對象;
			 */
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
			
			/**
			 * 讀取序列化數據;
			 * 指定轉換對象類型;
			 */
			userRead = (Users) ois.readObject();
			
			// 資源釋放;
			ois.close();
			
			// 獲取並打印對象信息;
			System.out.println("name: "+userRead.getNAME());
			System.out.println("ps: "+userRead.getPS());
			System.out.println("age: "+userRead.getAGE());
			System.out.println("id_card: "+userRead.getID_CARD());
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

/**
 * 封裝臨時的Entity類;
 * @author Administrator
 */
class Users implements java.io.Serializable {
	
	/**
	 * 定義私有變量;
	 * NAME;
	 * PS;
	 * AGE;
	 * ID_CARD;
	 */
	private String NAME;
	
	private String PS;
	
	private Integer AGE;
	
	/**
	 * transient關鍵字:
	 * 用來標記不需要序列化的數據屬性及內容;
	 * 表示瞬時態;
	 */
	private transient String ID_CARD;
	
	// 定義臨時調用方法;
	public void goining() {
		System.out.println("This is "+ NAME + AGE);
	}

	/**
	 * 提供get|set方法;
	 * @return
	 */
	public String getNAME() {
		return NAME;
	}

	public void setNAME(String nAME) {
		NAME = nAME;
	}

	public String getPS() {
		return PS;
	}

	public void setPS(String pS) {
		PS = pS;
	}

	public Integer getAGE() {
		return AGE;
	}

	public void setAGE(Integer aGE) {
		AGE = aGE;
	}

	public String getID_CARD() {
		return ID_CARD;
	}

	public void setID_CARD(String iD_CARD) {
		ID_CARD = iD_CARD;
	}
	
}
package cn.serializable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 數據集合的序列化也是同數據對象的序列化一樣;
 * 下面的繼續走一則有關序列化的Demo:
 * 
 * 集合序列化;
 * 
 * @author Administrator
 *
 */
public class SerializableTest {

	/**
	 * Java程序的入口|主函數;
	 * @param args
	 */
	public static void main(String[] args) {
		
		// 初始化一個文件流路徑;
		String path = "D://List.txt";
		
		// 利用構造器實例化多個對象;
		Users usera = new Users("Liu","admin");
		Users userb = new Users("Wang","wcadmin");
		Users userc = new Users("Fei","123");
		Users userd = new Users("Hu","123445");
		
		// 實例化一個指定裝載Users對象的List容器;
		List<Users> list = new ArrayList<Users>();
		
		// List集合數據轉載;
		list.add(usera);
		list.add(userb);
		list.add(userc);
		list.add(userd);
		
		
		try {
			
			/**
			 * 序列化;
			 * 
			 * 指定序列化地址,實例化ObjectOutputStream序列化對象;
			 */
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
			
			// 指定對象的進行序列化;
			oos.writeObject(list);
			
			// 資源釋放;
			oos.close();
			
			/**
			 * 反序列化;
			 * 指定序列化地址,實例化ObjectInputStream反序列化對象;
			 */
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
			
			/**
			 * 讀取序列化數據;
			 * 指定轉換對象類型;
			 */
			List<Users> listUsers = (List<Users>) ois.readObject();
			
			// 資源釋放;
			ois.close();
			
			// 獲取並打印對象信息;
			for(Users user : listUsers) {
				System.out.println("NAME: " + user.getNAME() + ";  PS: " + user.getPS());
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

/**
 * 封裝臨時的Entity類;
 * @author Administrator
 */
class Users implements java.io.Serializable {
	
	/**
	 * 定義私有變量;
	 * NAME;
	 * PS;
	 * AGE;
	 * ID_CARD;
	 */
	private String NAME;
	
	private String PS;
	
	private Integer AGE;
	
	/**
	 * transient關鍵字:
	 * 用來標記不需要序列化的數據屬性及內容;
	 * 表示瞬時態;
	 */
	private transient String ID_CARD;

	public Users (){}
	
	public Users (String name, String ps) {
		this.NAME = name;
		this.PS = ps;
	}
	
	// 定義臨時調用方法;
	public void goining() {
		System.out.println("This is "+ NAME + AGE);
	}

	/**
	 * 提供get|set方法;
	 * @return
	 */
	public String getNAME() {
		return NAME;
	}

	public void setNAME(String nAME) {
		NAME = nAME;
	}

	public String getPS() {
		return PS;
	}

	public void setPS(String pS) {
		PS = pS;
	}

	public Integer getAGE() {
		return AGE;
	}

	public void setAGE(Integer aGE) {
		AGE = aGE;
	}

	public String getID_CARD() {
		return ID_CARD;
	}

	public void setID_CARD(String iD_CARD) {
		ID_CARD = iD_CARD;
	}
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章