學(xué)習(xí)啦 > 知識(shí)大全 > 知識(shí)百科 > 百科知識(shí) > 什么是序列化_最終目的

什么是序列化_最終目的

時(shí)間: 謝君787 分享

什么是序列化_最終目的

  序列化使其他代碼可以查看或修改那些不序列化便無(wú)法訪問的對(duì)象實(shí)例數(shù)據(jù),那么你對(duì)序列化了解多少呢?以下是由學(xué)習(xí)啦小編整理關(guān)于什么是序列化的內(nèi)容,希望大家喜歡!

  什么是序列化

  序列化 (Serialization)將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。在序列化期間,對(duì)象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲(chǔ)區(qū)。以后,可以通過(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。

  序列化使其他代碼可以查看或修改那些不序列化便無(wú)法訪問的對(duì)象實(shí)例數(shù)據(jù)。確切地說(shuō),代碼執(zhí)行序列化需要特殊的權(quán)限:即指定了 SerializationFormatter 標(biāo)志的 SecurityPermission。在默認(rèn)策略下,通過(guò) Internet 下載的代碼或 Intranet 代碼不會(huì)授予該權(quán)限;只有本地計(jì)算機(jī)上的代碼才被授予該權(quán)限。

  通常,對(duì)象實(shí)例的所有字段都會(huì)被序列化,這意味著數(shù)據(jù)會(huì)被表示為實(shí)例的序列化數(shù)據(jù)。這樣,能夠解釋該格式的代碼有可能能夠確定這些數(shù)據(jù)的值,而不依賴于該成員的可訪問性。類似地,反序列化從序列化的表示形式中提取數(shù)據(jù),并直接設(shè)置對(duì)象狀態(tài),這也與可訪問性規(guī)則無(wú)關(guān)。

  對(duì)于任何可能包含重要的安全性數(shù)據(jù)的對(duì)象,如果可能,應(yīng)該使該對(duì)象不可序列化。如果它必須為可序列化的,請(qǐng)嘗試生成特定字段來(lái)保存不可序列化的重要數(shù)據(jù)。如果無(wú)法實(shí)現(xiàn)這一點(diǎn),則應(yīng)注意該數(shù)據(jù)會(huì)被公開給任何擁有序列化權(quán)限的代碼,并確保不讓任何惡意代碼獲得該權(quán)限。

  序列化的目的

  1、以某種存儲(chǔ)形式使自定義對(duì)象持久化;

  2、將對(duì)象從一個(gè)地方傳遞到另一個(gè)地方。

  3、使程序更具維護(hù)性。

  序列化的技術(shù)

  * 二進(jìn)制序列化保持類型保真度,這對(duì)于在應(yīng)用程序的不同調(diào)用之間保留對(duì)象的狀態(tài)很有用。例如,通過(guò)將對(duì)象序列化到剪貼板,可在不同的應(yīng)用程序之間共享對(duì)象。您可以將對(duì)象序列化到流、磁盤、內(nèi)存和網(wǎng)絡(luò)等等。遠(yuǎn)程處理使用序列化“通過(guò)值”在計(jì)算機(jī)或應(yīng)用程序域之間傳遞對(duì)象。

  * XML 序列化僅序列化公共屬性和字段,且不保持類型保真度。當(dāng)您要提供或使用數(shù)據(jù)而不限制使用該數(shù)據(jù)的應(yīng)用程序時(shí),這一點(diǎn)是很有用的。由于 XML 是一個(gè)開放式標(biāo)準(zhǔn),因此,對(duì)于通過(guò) Web 共享數(shù)據(jù)而言,這是一個(gè)很好的選擇。SOAP 同樣是一個(gè)開放式標(biāo)準(zhǔn),這使它也成為一個(gè)頗具吸引力的選擇。

  PHP中的序列化

  注: 在 php 3 中,在序列化和解序列化的過(guò)程中對(duì)象會(huì)失去類的關(guān)聯(lián)。結(jié)果的變量是對(duì)象類型,但是沒有類和方法,因此就沒什么用了(就好像一個(gè)用滑稽的語(yǔ)法定義的數(shù)組一樣)。

  serialize() 返回一個(gè)字符串,包含著可以儲(chǔ)存于 php 的任何值的字節(jié)流表示。unserialize() 可以用此字符串來(lái)重建原始的變量值。用序列化來(lái)保存對(duì)象可以保存對(duì)象中的所有變量。對(duì)象中的函數(shù)不會(huì)被保存,只有類的名稱。

  要能夠 unserialize() 一個(gè)對(duì)象,需要定義該對(duì)象的類。也就是,如果序列化了 page1.php 中類 A 的對(duì)象 $a,將得到一個(gè)指向類 A 的字符串并包含有所有 $a 中變量的值。如果要在 page2.php 中將其解序列化,重建類 A 的對(duì)象 $a,則 page2.php 中必須要出現(xiàn)類 A 的定義。例如可以這樣實(shí)現(xiàn),將類 A 的定義放在一個(gè)包含文件中,并在 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); // 現(xiàn)在可以用 $a 對(duì)象的 show_one() 函數(shù)了 $a->show_one();?>

  如果在用會(huì)話并使用了 session_register() 來(lái)注冊(cè)對(duì)象,這些對(duì)象會(huì)在每個(gè) php 頁(yè)面結(jié)束時(shí)被自動(dòng)序列化,并在接下來(lái)的每個(gè)頁(yè)面中自動(dòng)解序列化?;旧鲜钦f(shuō)這些對(duì)象一旦成為會(huì)話的一部分,就能在任何頁(yè)面中出現(xiàn)。

  強(qiáng)烈建議在所有的頁(yè)面中都包括這些注冊(cè)的對(duì)象的類的定義,即使并不是在所有的頁(yè)面中都用到了這些類。如果沒有這樣做,一個(gè)對(duì)象被解序列化了但卻沒有其類的定義,它將失去與之關(guān)聯(lián)的類并成為 stdClass 的一個(gè)對(duì)象而完全沒有任何可用的函數(shù),這樣就很沒有用處。

  因此如果在以上的例子中 $a 通過(guò)運(yùn)行 session_register("a") 成為了會(huì)話的一部分,應(yīng)該在所有的頁(yè)面中包含 classa.inc 文件,而不只是 page1.php 和 page2.php。
看過(guò)“序列化的目的”的人還看了:

1.介紹學(xué)習(xí)方法的演講稿5篇

2.亞杰認(rèn)知發(fā)展理論的特點(diǎn)有哪些

3.2016java web面試題

4.初中家長(zhǎng)學(xué)校工作計(jì)劃范文3篇

5.學(xué)習(xí)軍訓(xùn)精神心得體會(huì)3篇

6.初中政教處工作計(jì)劃范文3篇

1518600