国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP多種序列化以及反序列化例子

2024-05-04 21:50:14
字體:
供稿:網(wǎng)友

序列化是將變量轉(zhuǎn)換為可保存或傳輸?shù)淖址倪^程;反序列化就是在適當(dāng)?shù)臅r候把這個字符串再轉(zhuǎn)化成原來的變量使用。這兩個過程結(jié)合起來,可以輕松地存儲和傳輸數(shù)據(jù),使程序更具維護(hù)性。

1. serialize和unserialize函數(shù)

這兩個是序列化和反序列化PHP中數(shù)據(jù)的常用函數(shù)。

  1. <?php 
  2. $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
  3. //序列化數(shù)組 
  4. $s = serialize($a); 
  5. echo $s
  6. //輸出結(jié)果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";} 
  7. echo '<br /><br />'
  8. //反序列化 
  9. $o = unserialize($s); 
  10. print_r($o); 
  11. //輸出結(jié)果 Array ( [a] => Apple [b] => banana [c] => Coconut ) 
  12. ?> 

當(dāng)數(shù)組值包含如雙引號、單引號或冒號等字符時,它們被反序列化后,可能會出現(xiàn)問題。為了克服這個問題,一個巧妙的技巧是使用base64_encode和base64_decode。

  1. $obj = array(); 
  2. //序列化 
  3. $s = base64_encode(serialize($obj)); 
  4. //反序列化 
  5. $original = unserialize(base64_decode($s)); 

但是base64編碼將增加字符串的長度。為了克服這個問題,可以和gzcompress一起使用。

  1. //定義一個用來序列化對象的函數(shù) 
  2. function my_serialize( $obj ) 
  3.    return base64_encode(gzcompress(serialize($obj))); 
  4. //反序列化 
  5. function my_unserialize($txt
  6.    return unserialize(gzuncompress(base64_decode($txt))); 

2. json_encode 和 json_decode

使用JSON格式序列化和反序列化是一個不錯的選擇:

使用json_encode和json_decode格式輸出要serialize和unserialize格式快得多。

JSON格式是可讀的。

JSON格式比serialize返回數(shù)據(jù)結(jié)果小。

JSON格式是開放的、可移植的。其他語言也可以使用它。

  1. $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
  2. //序列化數(shù)組 
  3. $s = json_encode($a); 
  4. echo $s
  5. //輸出結(jié)果:{"a":"Apple","b":"banana","c":"Coconut"} 
  6. echo '<br /><br />'
  7. //反序列化 
  8. $o = json_decode($s); 

在上面的例子中,json_encode輸出長度比上個例子中serialize輸出長度顯然要短。

3. var_export 和 eval

var_export 函數(shù)把變量作為一個字符串輸出;eval把字符串當(dāng)成PHP代碼來執(zhí)行,反序列化得到最初變量的內(nèi)容。

  1. $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
  2.  
  3. //序列化數(shù)組 
  4.  
  5. $s = var_export($a , true); 
  6.  
  7. echo $s
  8.  
  9. //輸出結(jié)果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', ) 
  10.  
  11. echo '<br /><br />'
  12.  
  13. //反序列化 
  14.  
  15. eval('$my_var=' . $s . ';'); 
  16.  
  17. print_r($my_var); 

4. wddx_serialize_value 和 wddx deserialize

wddx_serialize_value函數(shù)可以序列化數(shù)組變量,并以XML字符串形式輸出。

  1. $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); 
  2.  
  3. //序列化數(shù)組 
  4. $s = wddx_serialize_value($a); 
  5. echo $s
  6.  
  7. //輸出結(jié)果(查看輸出字符串的源碼):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket> 
  8.  
  9. echo '<br /><br />'
  10.  
  11. //反序列化 
  12. $o = wddx_deserialize($s); 
  13. print_r($o); 
  14. //輸出結(jié)果:Array ( [a] => Apple [b] => banana 1 => Coconut ) 

可以看出,XML標(biāo)簽字符較多,導(dǎo)致這種格式的序列化還是占了很多空間。

小結(jié):

上述所有的函數(shù)在序列化數(shù)組變量時都能正常執(zhí)行,但運用到對象就不同了。例如json_encode序列化對象就會失敗。反序列化對象時,unserialize和eval將有不同的效果。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泰顺县| 文登市| 通城县| 利辛县| 平乡县| 和平县| 陕西省| 遂宁市| 交口县| 汉沽区| 江安县| 岚皋县| 淮安市| 鞍山市| 长春市| 昌图县| 西盟| 宿松县| 嘉义县| 祁连县| 隆昌县| 信丰县| 无为县| 樟树市| 隆子县| 布拖县| 礼泉县| 新沂市| 镇坪县| 广南县| 巴南区| 常州市| 大埔区| 中西区| 凤凰县| 平凉市| 闸北区| 邵武市| 新竹市| 乌拉特前旗| 桐乡市|