天天看點

檔案讀取的時候要留意 -- 序列化serialize()與反序列化unserialize():

序列化serialize()與反序列化unserialize():

序列化serialize():就是将一個變量所代表的 “記憶體資料”轉換為“字元串”的形式,并持久儲存在硬碟(寫入檔案中儲存)上的一種做法,即,把“記憶體資料”轉換為“字元串”然後儲存到檔案中;你正 serialize() 的數組/對象中的引用也将被存儲。

反序列化unserialize():就是将序列化之後儲存在硬碟(檔案)上的“字元串資料”恢複為其原來的記憶體形式的變量資料的一種做法,即,把檔案中儲存的序列化後的“字元串資料”恢複為“記憶體資料”;

對象的序列化:1.對一個對象進行序列化,隻能将其屬性資料“儲存起來”,而方法被忽略(方法不是資料),但是類名也能被儲存起來,是以反序列化的位置隻要有該類檔案,就仍然可以将對象還原,即該對象的屬性和方法依然可以使用;

    2.對象序列化的時候,會自動調用該對象所屬類的__sleep()魔術方法;

對象的反序列化:1.對一個對象進行反序列化,其實是恢複原來儲存起來的屬性資料,而且,此時必須需要依賴該對象原來的所屬類;

2.對象反序列化的時候,會自動調用該對象所屬類的__wakeup()魔術方法;

總結:一般當我們需要将資料儲存到檔案中時會用到序列化,儲存到資料庫中一般不這樣用,因為序列化和反序列化的過程其實很耗時;

使用執行個體如下:

1 <?php
 2 /*
 3  * 對基本資料進行序列化和反序列化
 4  * */
 5 $v1 = 1 ;
 6 $v2 = "abc" ;
 7 $v3 = false ;
 8 $v4 = array(41,42,43) ;
 9 /*再對它們進行序列化*/
10 $str1 = serialize($v1) ;//将記憶體資料轉換為字元串
11 $str2 = serialize($v2) ;
12 $str3 = serialize($v3) ;
13 $str4 = serialize($v4) ;
14 file_put_contents("./file1.txt",$str1) ;//将序列化後的字元串資料儲存到硬碟(檔案)中
15 file_put_contents("./file2.txt",$str2) ;//将序列化後的字元串資料儲存到硬碟(檔案)中
16 file_put_contents("./file3.txt",$str3) ;//将序列化後的字元串資料儲存到硬碟(檔案)中
17 file_put_contents("./file4.txt",$str4) ;//将序列化後的字元串資料儲存到硬碟(檔案)中
18 /*再對它們進行反序列化*/
19 $str1 = file_get_contents('./file1.txt') ;//讀取硬碟(檔案)上儲存的序列化後的字元串資料
20 $str2 = file_get_contents('./file2.txt') ;//讀取硬碟(檔案)上儲存的序列化後的字元串資料
21 $str3 = file_get_contents('./file3.txt') ;//讀取硬碟(檔案)上儲存的序列化後的字元串資料
22 $str4 = file_get_contents('./file4.txt') ;//讀取硬碟(檔案)上儲存的序列化後的字元串資料
23 $v1 = unserialize($str1) ; //将序列化後的“字元串資料”反序列化為“記憶體資料”
24 $v2 = unserialize($str2) ; //将序列化後的“字元串資料”反序列化為“記憶體資料”
25 $v3 = unserialize($str3) ; //将序列化後的“字元串資料”反序列化為“記憶體資料”
26 $v4 = unserialize($str4) ; //将序列化後的“字元串資料”反序列化為“記憶體資料”
27 
28 /*
29  * 對象的序列化和反序列化
30  * */
31 /*當new一個類的對象時,若該類不存在,就會自動調用該方法來加載所需要的類檔案*/
32 function __autoload($className){//php的自動加載類,參數為類名,類檔案命名規則為:類名.class.php
33     $fileName =  "./".$className.".class.php" ;
34     include_once $fileName ;
35 }
36 $obj1 = new MP3Player();
37 $name1 = $obj1 ->name ;
38 $obj1 ->dataIn() ;
39 $obj1 ->next() ;
40 /*序列化對象*/
41 $s1 = serialize($obj1) ;//将obj1對象轉換為字元串資料
42 file_put_contents('./obj1.txt',$s1) ;//儲存在硬碟(檔案)中
43 /*反序列化對象*/
44 $s1 = file_get_contents('./obj1.txt') ;//讀取硬碟上的字元串資料
45 $obj2 = unserialize($s1) ;//将序列化後的字元串資料還原為記憶體資料
46 $name2 = $obj2 ->name ;
47 /*雖然序列化後隻儲存了對象的屬性資料而沒有儲存對象的方法,但是其儲存了對象的類名,
48 *是以進行反序列化後對象内的方法任然存在,仍然可以供對象調用,反序列化的過程
49  * 就是對原來對象進行恢複的過程*/
50 $obj2 ->dataIn() ;
51 $obj2 ->next() ;      

serialize和json_encode 差別:

1)serialize主要用于php的序列化,存儲到檔案或者資料庫中,json_encode 也是序列化,但是 主要用于與其他語言比如js進行互動使用,對于傳輸來說,json有許多優點。

(2)在顯示上,serialize序列化的字元串包含額外的内容,這是值的類型和長度的編碼

(3)在進行 json_decode解碼的時候需要注意,如果是序列化的數值型數組,那麼json_decode 可以還原為原來的數組(數值型數組哦),但是,如果序列化的是關聯數組(或者對象),那麼由于json_decode無法判斷是關聯數組還是對象(我們可以了解為這兩個長的像無法區分),是以json_decode會預設還原解析為stdclass的對象,如果加了true才解析為關聯數組

(4)json_encode不能序列化對象的成員方法,代碼如下:

  serialize序列化之後,反序列化的資料,可以重新調用成員方法,但是json_decode不行,會報錯,具體可以測試、