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