BeanSerializableInterface應用
Bean Serializable Interface 的接口讓BEAN可以串行化,將其變成一個可保存為以后使用的二進制流。當一個BEAN被系列化到磁盤上或者其他任何地方,其狀態被保存起來,其中的屬性值也不會改變。在BEAN的規范中,JSP并沒有要求BEAN實現Serializable接口。但是,如果您希望自己控制您所創建的組件的serialization進程,或者您想serialize并不是標準組件擴展的組件,您必須了解serialization and deserialization的細節。
有幾個原因你會把BEAN冷藏起來以備后用。有些服務器通過將所有的SESSION 數據(包括BEAN)寫入磁盤來支持任意長的SESSION生命期,即使服務器停機也不會丟失。當服務器重新啟動后,串行化的數據被恢復。同樣的理由,在重負載的站點上支持服務器分簇的環境中,許多服務器通過串行化來復制SESSION。如果你的BEAN不支持串行化,服務器就不能正確地保存和傳輸類。
通過同樣的策略,你可以選擇將BEAN保存在磁盤上或者數據庫中,以備后用。例如,也許可以將客戶的購物車實現為一個BEAN,在訪問期間將其保存在數據庫中。
如果BEAN需要特殊的復雜的初始設置,可以將BEAN設置好后串行化保存在磁盤上。這個BEAN的“快照”可以用在任何需要的地方,包括在$#@60;jsp:useBean$#@62;中用beanName屬性的調用。
$#@60;jsp:useBean$#@62;標簽中的beanName屬性,用來實例化一個串行化的BEAN,而不是用來從一個類創建一個全新的實例。如果BEAN還沒有創建,beanName屬性傳給java.beans.Bean.instantiate()方法,由類裝載器對類進行實例化。它首先假定存在一個串行化的BEAN(帶有擴展名.ser),然后會將其激活。如果這個操作失敗,它就會實例化一個新的實例。
下面簡單介紹一下這個接口:
對象能包含其它的對象,而這其它的對象又可以包含另外的對象。JAVA serialization能夠自動的處理嵌套的對象。對于一個對象的簡單的域,writeObject()直接將值寫入流。而,當遇到一個對象域時,writeObject()被再次調用,如果這個對象內嵌另一個對象,那么,writeObject() 又被調用,直到對象能被直接寫入流為止。程序員所需要做的是將對象傳入ObjectOutputStream 的writeObject() 方法,剩下的將又系統自動完成。下面的例子創建了一個調用mine對象的PersonalData對象。代碼實現的是將一個串和mine 對象輸出到一個流,并存入一個文件:
public class PersonalData implements Serializable {
public int id
public int yearOfBirth;
public float yearlySalary;
}
PersonalData mine = new PersonalData(101, 1956, 46500.00);
FileOutputStream outstream = new FileOutputStream("PersonalData.ser");
ObjectOutputStream out = new ObjectOutputStream(outstream);
out.writeObject("My personal data"); //將一個串寫入流
out.writeObject(mine); //將這個對象寫入流
out.close(); // 清空并關閉流
...
一個FileOutputStream對象被創建且傳到一個ObjectOutputStream。當out.writeObject() 被調用,這個串和mine 對象被objects are serializ順序加入一個存入文件PersonalData.ser的字節對列。
您應該注意上述類是實現的java.io.Serializable接口。因為它并未指定要實現的方法,所以Serializable被稱為"tagging interface" ,但是它僅僅"tags"它自己的對象是一個特殊的類型。任一個您希望serialize的對象都應該實現這個接口。這是必須的。否則,用到流技術時將根本不工作。例如,如果您試著去serialize 一個沒有實現這個接口的對象,一個 NotSerializableException將產生。
有幾個原因你會把BEAN冷藏起來以備后用。有些服務器通過將所有的SESSION 數據(包括BEAN)寫入磁盤來支持任意長的SESSION生命期,即使服務器停機也不會丟失。當服務器重新啟動后,串行化的數據被恢復。同樣的理由,在重負載的站點上支持服務器分簇的環境中,許多服務器通過串行化來復制SESSION。如果你的BEAN不支持串行化,服務器就不能正確地保存和傳輸類。
通過同樣的策略,你可以選擇將BEAN保存在磁盤上或者數據庫中,以備后用。例如,也許可以將客戶的購物車實現為一個BEAN,在訪問期間將其保存在數據庫中。
如果BEAN需要特殊的復雜的初始設置,可以將BEAN設置好后串行化保存在磁盤上。這個BEAN的“快照”可以用在任何需要的地方,包括在$#@60;jsp:useBean$#@62;中用beanName屬性的調用。
$#@60;jsp:useBean$#@62;標簽中的beanName屬性,用來實例化一個串行化的BEAN,而不是用來從一個類創建一個全新的實例。如果BEAN還沒有創建,beanName屬性傳給java.beans.Bean.instantiate()方法,由類裝載器對類進行實例化。它首先假定存在一個串行化的BEAN(帶有擴展名.ser),然后會將其激活。如果這個操作失敗,它就會實例化一個新的實例。
下面簡單介紹一下這個接口:
對象能包含其它的對象,而這其它的對象又可以包含另外的對象。JAVA serialization能夠自動的處理嵌套的對象。對于一個對象的簡單的域,writeObject()直接將值寫入流。而,當遇到一個對象域時,writeObject()被再次調用,如果這個對象內嵌另一個對象,那么,writeObject() 又被調用,直到對象能被直接寫入流為止。程序員所需要做的是將對象傳入ObjectOutputStream 的writeObject() 方法,剩下的將又系統自動完成。下面的例子創建了一個調用mine對象的PersonalData對象。代碼實現的是將一個串和mine 對象輸出到一個流,并存入一個文件:
public class PersonalData implements Serializable {
public int id
public int yearOfBirth;
public float yearlySalary;
}
PersonalData mine = new PersonalData(101, 1956, 46500.00);
FileOutputStream outstream = new FileOutputStream("PersonalData.ser");
ObjectOutputStream out = new ObjectOutputStream(outstream);
out.writeObject("My personal data"); //將一個串寫入流
out.writeObject(mine); //將這個對象寫入流
out.close(); // 清空并關閉流
...
一個FileOutputStream對象被創建且傳到一個ObjectOutputStream。當out.writeObject() 被調用,這個串和mine 對象被objects are serializ順序加入一個存入文件PersonalData.ser的字節對列。
您應該注意上述類是實現的java.io.Serializable接口。因為它并未指定要實現的方法,所以Serializable被稱為"tagging interface" ,但是它僅僅"tags"它自己的對象是一個特殊的類型。任一個您希望serialize的對象都應該實現這個接口。這是必須的。否則,用到流技術時將根本不工作。例如,如果您試著去serialize 一個沒有實現這個接口的對象,一個 NotSerializableException將產生。