401
魔獸
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