1. 程式人生 > >淺談物件中的成員序列化問題

淺談物件中的成員序列化問題

       Java物件序列化時參與序列化的內容包含以下幾個方面。

        第一、屬性,包括基本資料型別、陣列以及其他物件的應用。

        第二、類名。

        不能被序列化的內容有以下幾個方面。

        第一、方法。

        第二、有static修飾的屬性。

        第三、有transient修飾的屬性。

        在序列化過程中不僅保留當前類物件的資料,而且遞迴儲存物件引用的每個物件的資料。將整個物件層次寫入位元組流中,這也就是序列化物件的“深複製”,即複製物件本身及引用的物件本身。序列化一個物件將可能得到整個物件序列。

        在序列化過程中,由於有些屬性值比較敏感(例如密碼),或者有些屬性值的資訊量比較大,它們不需要在網路中傳遞或在磁碟中儲存,即不需要參與序列化。對於此類屬性只需要在定義時為其新增transient關鍵字即可,對於transien屬性序列化機制會跳過而不會將其寫入檔案,但在讀取時也不可被恢復,該屬性值保持預設初始化值。

        我簡單的寫了個程式碼,如下:

        第一、定義序列化型別Picture

public class Picture implements Serializable {

	private static final long serialVersionUID = 1L;

	private String name;
	private String category;
	private transient String url;
	private static int width;
	private static int length;

	public String getName() {
		return name;
	}

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

	public String getCategory() {
		return category;
	}

	public void setCategory(String category) {
		this.category = category;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public static int getWidth() {
		return width;
	}

	public static void setWidth(int width) {
		Picture.width = width;
	}

	public static int getLength() {
		return length;
	}

	public static void setLength(int length) {
		Picture.length = length;
	}

	@Override
	public String toString() {
		return "圖片名稱:" + name + ", 圖片類別:" + category + ", URL=" + url + ", 長=" + length + ", 寬=" + width;
	}
	
}

        第二、對Picture物件進行讀寫操作
/**
 * 在main方法中,如果同時執行write()和read(),則結果為=======圖片名稱:baby, 圖片類別:Portraits, URL=null, 長=128, 寬=256<br/>
 * 如果先執行write(),在執行read(),則結果為=======圖片名稱:baby, 圖片類別:Portraits, URL=null, 長=0, 寬=0
 * @author gsucbiao
 *
 * @date 2011-9-5 && 下午11:41:55
 */
public class InputAndOutputPicture {

	public static void main(String[] args) {
		InputAndOutputPicture ps = new InputAndOutputPicture();
		
		try {
//			ps.write();
			ps.read();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void read() {
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		try {
			fis = new FileInputStream("E://picture.txt");
			ois = new ObjectInputStream(fis);
			Picture picture = (Picture) ois.readObject();
			System.out.println("=======" + picture.toString());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				fis.close();
				ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private void write() {
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;
		try {
			fos = new FileOutputStream("E://picture.txt");
			oos = new ObjectOutputStream(fos);
			Picture picture = new Picture();
			picture.setName("baby");
			picture.setCategory("Portraits");
			picture.setUrl("http://www.snakespirit.picture/baby.jpg");
			picture.setLength(128);
			picture.setWidth(256);
			oos.writeObject(picture);
			oos.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fos.close();
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

        通過上述測試可知,url屬性被transient關鍵字修飾時,該屬性值不會參與檔案的讀寫操作。而被static關鍵字修飾的length、width也沒有參與序列化過程。