閱讀401 返回首頁    go 魔獸


Java IO--對象序列化Serializable、ObjectOutputStream、ObjectInputStream、transient

1、對象序列化是什麼?

一個對象產生之後實際上是在內存中為其開辟了一個存儲空間,方便存儲信息。

定義可序列化的類:

import java.io.Serializable ;
public class Person implements Serializable{
	private String name ;	// 聲明name屬性,但是此屬性不被序列化
	private int age ;		// 聲明age屬性
	public Person(String name,int age){	// 通過構造設置內容
		this.name = name ;
		this.age = age ;
	}
	public String toString(){	// 覆寫toString()方法
		return "姓名:" + this.name + ";年齡:" + this.age ;
	}
};
以後此類的對象,就可以被序列化了。變為二進製byte流。

對象的序列化和反序列化:


serialVersionUID


import java.io.Serializable ;
public class Person implements Serializable{
	private static final long serialVersionUID = 1L;/*驗證版本的一致性*/
	private String name ;	// 聲明name屬性
	private int age ;		// 聲明age屬性
	public Person(String name,int age){	// 通過構造設置內容
		this.name = name ;
		this.age = age ;
	}
	public String toString(){	// 覆寫toString()方法
		return "姓名:" + this.name + ";年齡:" + this.age ;
	}
};
如果使用開發工具開發,沒有編寫此代碼,則會出現一些安全警告信息。

2、對象的序列化:ObjectOutputStream


import java.io.File ;
import java.io.FileOutputStream ;
import java.io.OutputStream ;
import java.io.ObjectOutputStream ;
public class SerDemo01{
	public static void main(String args[]) throws Exception {
		File f = new File("D:" + File.separator + "test.txt") ;	// 定義保存路徑
		ObjectOutputStream oos = null ;	// 聲明對象輸出流
		OutputStream out = new FileOutputStream(f) ;	// 文件輸出流
		oos = new ObjectOutputStream(out) ;
		oos.writeObject(new Person("張三",30)) ;	// 保存對象
		oos.close() ;	// 關閉
	}
};

所有的對象擁有各自的屬性值,但是所有的方法都是公共的,所以序列化對象的時候實際上序列化的就是屬性。

3、對象的反序列化:ObjectInputStream


import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.io.ObjectInputStream ;
public class SerDemo02{
	public static void main(String args[]) throws Exception {
		File f = new File("D:" + File.separator + "test.txt") ;	// 定義保存路徑
		ObjectInputStream ois = null ;	// 聲明對象輸入流
		InputStream input = new FileInputStream(f) ;	// 文件輸入流
		ois = new ObjectInputStream(input) ;	// 實例化對象輸入流
		Object obj = ois.readObject() ;	// 讀取對象
		ois.close() ;	// 關閉
		System.out.println(obj) ;
	}
};

4、transient關鍵字


import java.io.Serializable ;
public class Person implements Serializable{
	private static final long serialVersionUID = 1L;
	private transient String name ;	// 聲明name屬性,但是此屬性不被序列化
	private int age ;		// 聲明age屬性
	public Person(String name,int age){	// 通過構造設置內容
		this.name = name ;
		this.age = age ;
	}
	public String toString(){	// 覆寫toString()方法
		return "姓名:" + this.name + ";年齡:" + this.age ;
	}
};
操作代碼:

import java.io.File ;
import java.io.IOException ;
import java.io.FileOutputStream ;
import java.io.OutputStream ;
import java.io.ObjectOutputStream ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.io.ObjectInputStream ;
public class SerDemo04{
	public static void main(String args[]) throws Exception{
		ser() ;
		dser() ;
	}
	public static void ser() throws Exception {
		File f = new File("D:" + File.separator + "test.txt") ;	// 定義保存路徑
		ObjectOutputStream oos = null ;	// 聲明對象輸出流
		OutputStream out = new FileOutputStream(f) ;	// 文件輸出流
		oos = new ObjectOutputStream(out) ;
		oos.writeObject(new Person("張三",30)) ;	// 保存對象
		oos.close() ;	// 關閉
	}
	public static void dser() throws Exception {
		File f = new File("D:" + File.separator + "test.txt") ;	// 定義保存路徑
		ObjectInputStream ois = null ;	// 聲明對象輸入流
		InputStream input = new FileInputStream(f) ;	// 文件輸入流
		ois = new ObjectInputStream(input) ;	// 實例化對象輸入流
		Object obj = ois.readObject() ;	// 讀取對象
		ois.close() ;	// 關閉
		System.out.println(obj) ;
	}
};


5、序列化一組對象


如果要保存多個對象,則最好使用對象數組的形式完成。
import java.io.File ;
import java.io.IOException ;
import java.io.FileOutputStream ;
import java.io.OutputStream ;
import java.io.ObjectOutputStream ;
import java.io.FileInputStream ;
import java.io.InputStream ;
import java.io.ObjectInputStream ;
public class SerDemo05{
	public static void main(String args[]) throws Exception{
		Person per[] = {new Person("張三",30),new Person("李四",31),
			new Person("王五",32)} ;
		ser(per) ;
		Object o[] = (Object[])dser() ;
		for(int i=0;i<o.length;i++){
			Person p = (Person)o[i] ;
			System.out.println(p) ;
		}
	}
	public static void ser(Object obj[]) throws Exception {
		File f = new File("D:" + File.separator + "test.txt") ;	// 定義保存路徑
		ObjectOutputStream oos = null ;	// 聲明對象輸出流
		OutputStream out = new FileOutputStream(f) ;	// 文件輸出流
		oos = new ObjectOutputStream(out) ;
		oos.writeObject(obj) ;	// 保存對象
		oos.close() ;	// 關閉
	}
	public static Object[] dser() throws Exception {
		File f = new File("D:" + File.separator + "test.txt") ;	// 定義保存路徑
		ObjectInputStream ois = null ;	// 聲明對象輸入流
		InputStream input = new FileInputStream(f) ;	// 文件輸入流
		ois = new ObjectInputStream(input) ;	// 實例化對象輸入流
		Object obj[] = (Object[])ois.readObject() ;	// 讀取對象
		ois.close() ;	// 關閉
		return obj ;
	}
};


最後更新:2017-04-03 14:54:23

  上一篇:go android 實現由下至上彈出並位於屏幕底部的提示框
  下一篇:go Java優先隊列(PriorityQueue)示例