目的
1、以某種存儲形式使自定義對象持久化;
2、將對象從一個地方傳遞到另一個地方。
3、使程式更具維護性。
技術
* 二進制序列化保持類型保真度,這對於在應用程式的不同調用之間保留對象的狀態很有用。例如,通過將對象序列化到剪貼簿,可在不同的應用程式之間共享對象。您可以將對象序列化到流、磁碟、記憶體和網路等等。遠程處理使用序列化“通過值”在計算機或應用程式域之間傳遞對象。
* XML 序列化僅序列化公共屬性和欄位,且不保持類型保真度。當您要提供或使用數據而不限制使用該數據的應用程式時,這一點是很有用的。由於 XML 是一個開放式標準,因此,對於通過 Web 共享數據而言,這是一個很好的選擇。SOAP 同樣是一個開放式標準,這使它也成為一個頗具吸引力的選擇。
PHP
注: 在 php 3 中,在序列化和解序列化的過程中對象會失去類的關聯。結果的變數是對象類型,但是沒有類和方法,因此就沒什麼用了(就好像一個用滑稽的語法定義的數組一樣)。
serialize() 返回一個字元串,包含著可以儲存於 php 的任何值的位元組流表示。 unserialize() 可以用此字元串來重建原始的變數值。用序列化來保存對象可以保存對象中的所有變數。對象中的函式不會被保存,只有類的名稱。
要能夠 unserialize() 一個對象,需要定義該對象的類。也就是,如果序列化了 page1.php 中類 A 的對象 $a,將得到一個指向類 A 的字元串並包含有所有 $a 中變數的值。如果要在 page2.php 中將其解序列化,重建類 A 的對象 $a,則 page2.php 中必須要出現類 A 的定義。例如可以這樣實現,將類 A 的定義放在一個包含檔案中,並在 page1.php 和 page2.php 都包含此檔案。
<?php// classa.inc: class A { var $one = 1; function show_one() { echo $this->one; } }// page1.php: include("classa.inc"); $a = new A; $s = serialize($a); // 將 $s 存放在某處使 page2.php 能夠找到 $fp = fopen("store", "w"); fwrite($fp, $s); fclose($fp);// page2.php: // 為了正常解序列化需要這一行 include("classa.inc"); $s = implode("", @file("store")); $a = unserialize($s); // 現在可以用 $a 對象的 show_one() 函式了 $a->show_one();?>
如果在用會話並使用了 session_register() 來註冊對象,這些對象會在每個 php 頁面結束時被自動序列化,並在接下來的每個頁面中自動解序列化。基本上是說這些對象一旦成為會話的一部分,就能在任何頁面中出現。
強烈建議在所有的頁面中都包括這些註冊的對象的類的定義,即使並不是在所有的頁面中都用到了這些類。如果沒有這樣做,一個對象被解序列化了但卻沒有其類的定義,它將失去與之關聯的類並成為 stdClass 的一個對象而完全沒有任何可用的函式,這樣就很沒有用處。
因此如果在以上的例子中 $a 通過運行 session_register("a") 成為了會話的一部分,應該在所有的頁面中包含 classa.inc 檔案,而不只是 page1.php 和 page2.php。