串列化

串列化

串列化是微軟提供的用於對對象進行文件I/O的一種機制,該機制在框架(Frame)/文檔(Document)/視圖(View) 模式中得到了很好的應用。

特性


串列化有以下但不局限於這些優點:
1.串列化是一種更好地使用類持久化的方法
2.可用於遠程方法調用,如SOAP
3.一種分佈對象的方法,特別是在軟體組件中,如COM、CORBA
4.在隨時間變化的數據(time-varying data)檢測改變
由於這些特性都是十分有用的,所以必須維持串列化的體系結構獨立性。例如在一台運行在不同硬體構架上的計算機應該能夠可靠地重新構建數據而不關心其對位元組(byte)數據的編排方式(endianness)。

影響(Consequences)


但是,由於串列化可能將暴露私有實現細節從而打破了抽象數據結構的不透明性。為了不讓競爭對手做出兼容的產品,很多私有軟體開發商都是將其程序的串列化格式作為機密的,因此他們可能故意混淆或加密其串列化的數據。
儘管如此,現在的協作要求能夠相互識別其串列化的數據。因此像CORBA這樣的遠程方法調用的架構會詳細定義其串列化的格式以及提供相應的方法在重新構建對象時檢查數據的一致性。

編程語言支持


很多面向對象的語言都提供對串列化支持,無論是通過語法糖(Syntactic sugar)還是通過定義標準的介面來實現。

.NET Framework


微軟提供的串列化是用於對對象進行文件I/O的一種機制,該機制在框架(Frame)/文檔(Document)/視圖(View) 模式中得到了很好的應用。
串列化可以把變數包括對象,轉化成連續bytes數據. 你可以將串列化后的變數存在一個文件里或在網路上傳輸. 然後再反串列化還原為原來的數據。
對象的壽命通常隨著生成該對象的程序的終止而終止。有時候,可能需要將對象的狀態保存下來,在需要時再將對象恢復。我們把對象的這種能記錄自己的狀態以便將來再生的能力,叫做對象的持續性(persistence)。對象通過寫出描述自己狀態的數值來「記錄自己」,這個過程叫對象的串列化(Serialization)。

Java


java中串列化對象必須:
1、該對象的類必須實現Serializable介面
2、該對象的串列化成員必須是非靜態成員變數,即不能保存任何的成員方法和靜態的成員變數,而且串列化保存的只是變數的值,對於變數的任何修飾符,都不能保存。而對於某些類型的對象,其狀態是瞬時的,這樣的對象是無法保存其狀態的,例如一個Thread對象,或一個FileInputStream對象,對於這些欄位,我們必須用 transient 關鍵字標明。 (註:保存任何的成員方法和靜態的成員變數沒有任何的意義,因為對象的類已經完整的保存了他們)
3、要串列化一個對象,必須與一定的對象輸入/輸出流聯繫起來,通過對象輸出流將對象狀態保存下來,再通過對象輸入流將對象狀態恢復。
下面是一個簡單示例:
import java.io.*;
public class Cat implements Serializable {
private String name;
public Cat () {
this.name = "new cat";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat cat = new Cat();
try {
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1> " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream("catDemo.out");
ObjectInputStream ois = new ObjectInputStream(fis);
cat = (Cat) ois.readObject();
System.out.println(" 2> " + cat.getName());
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}