java outputstream stringbuffer_InputStream 和OutputStream
4.8 對象的串行化(Serialization)
4.8.1 串行化的定義
1. 什么是串行化
對象的壽命通常隨著生成該對象的程序的終止而終止。有時候,可能需要將對象的狀態保存下來,在需要時再將對象恢復。我們把對象的這種能記錄自己的狀態
以便將來再生的能力,叫做對象的持續性(persistence)。對象通過寫出描述自己狀態的數值來記錄自己,這個過程叫對象的串行化
(Serialization)。
2. 串行化的目的
串行化的目的是為java的運行環境提供一組特性,其主要任務是寫出對象實例變量的數值。
4.8.2 串行化方法
在java.io包中,接口Serializable用來作為實現對象串行化的工具,只有實現了Serializable的類的對象才可以被串行化。
1. 定義一個可串行化對象
public class Student implements Serializable{
int id; //學號
String name; //姓名
int age; //年齡
String department //系別
public Student(int id,String name,int age,String department){
this.id = id;
this.name = name;
this.age = age;
this.department = department;
}
}
2. 構造對象的輸入/輸出流
要串行化一個對象,必須與一定的對象輸入/輸出流聯系起來,通過對象輸出流將對象狀態保存下來,再通過對象輸入流將對象狀態恢復。
java.io包中,提供了ObjectInputStream和ObjectOutputStream將數據流功能擴展至可讀寫對象。在
ObjectInputStream中用readObject()方法可以直接讀取一個對象,ObjectOutputStream中用
writeObject()方法可以直接將對象保存到輸出流中。
Student stu=new Student(981036,"Liu Ming",18, "CSD");
FileOutputStream fo=new FileOutputStream("data.ser");
//保存對象的狀態
ObjectOutputStream so=new ObjectOutputStream(fo);
try{
so.writeObject(stu);
so.close();
}catch(IOException e )
{System.out.println(e);}
FileInputStream fi=new FileInputStream("data.ser");
ObjectInputStream si=new ObjectInputStream(fi);
//恢復對象的狀態
try{
stu=(Student)si.readObject();
si.close();
}catch(IOException e )
{System.out.println(e);}
在
這個例子中,我們首先定義一個類Student,實現了
Serializable接口,然后通過對象輸出流的writeObject()方法將Student對象保存到文件data.ser中。之后,通過對象
輸入流的readObject()方法從文件data.ser中讀出保存下來的Student對象。
4.8.3 串行化的注意事項
1.串行化能保存的元素
只能保存對象的非靜態成員變量,不能保存任何的成員方法和靜態的成員變量,而且串行化保存的只是變量的值,對于變量的任何修飾符,都不能保存。
2.transient關鍵字
對于某些類型的對象,其狀態是瞬時的,這樣的對象是無法保存其狀態的,例如一個Thread對象,或一個FileInputStream對象,對于這些字段,我們必須用transient關鍵字標明
3. 定制串行化
缺省的串行化機制,對象串行化首先寫入類數據和類字段的信息,然后按照名稱的上升排列順序寫入其數值。如果想自己明確地控制這些數值的寫入順序和寫入
種類,必須定義自己的讀取數據流的方式。就是在類的定義中重寫writeObject()和readObject()方法。
例如可在4.8.2的例子中,加入重寫的writeObject()和readObject()方法,對Student 類定制其串行化。
private void writeObject(ObjectOutputStream out)throws IOException
{
out.writeInt(id);
out.writeInt(age);
out.writeUTF(name);
out.writeUTF(department);
}
private void readObject(ObjectInputStream in)throws IOException
{
id=in.readInt();
age=in.readInt();
name=in.readUTF();
department=in.readUTF();
}
總結
以上是生活随笔為你收集整理的java outputstream stringbuffer_InputStream 和OutputStream的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 字符串 f_Python字
- 下一篇: java代码同时下载_java代码实现打