序列化的概念
序列化是將對象狀態轉換為可保持或可傳輸的格式的過程 與序列化相對的是反序列化 它將流轉換為對象 這兩個過程結合起來 可以輕松地存儲和傳輸數據
將對象的狀態信息轉換為可以存儲或傳輸的窗體的過程 在序列化期間 對象將其當前狀態寫入到臨時或持久性存儲區 以後 可以通過從存儲區中讀取或反序列化對象的狀態 重新創建該對象
通常 對象實例的所有字段都會被序列化 這意味著數據會被表示為實例的序列化數據 這樣 能夠解釋該格式的代碼有可能能夠確定這些數據的值 而不依 賴於該成員的可訪問性 類似地 反序列化從序列化的表示形式中提取數據 並直接設置對象狀態 這也與可訪問性規則無關 對於任何可能包含重要的安全性數據的對象 如果可能 應該使該對象不可序列化 如果它必須為可序列化的 請嘗試生成特定字段來保存不可序列化的重要數據 如果無法實現這壹點 則應註意該數據會被公開給任何擁有序列化權限的代碼 並確保不讓任何惡意代碼獲得該權限
JSON的概念
JSON JavaScript Object Notation 壹種更輕 更友好的用於接口(AJAX REST等)數據交換的格式 JSON是結構化數據串行化的文本格式 作為XML的壹種替代品 用於表示客戶端與服務器間數據交換有效負載的格式 它是從ECMAScript語言標準 衍生而來的 JSON的設計目標是使它成為小的 輕便的 文本的 而且是JavaScript的壹個子集
長度的比較
如下壹段代碼 顯示了對數組和對象編碼後生成的字符串及其長度
復制代碼 代碼如下: class Foo {public $int = ; ? public $bool = TRUE; ? public $array = array(array( ) => test string );
public function test($flag) { ? echo $flag test function for Foo <br /> ; ? }
public static function output($str) { ? echo $str <br /> ; ? }
public static function pare_serialize_and_json($data) { ? $serialize_str =? serialize($data); ? self::output( 序列化後的值: $serialize_str "; length=" ? strlen($serialize_str));
$json_str = json_encode($data); ? self::output( JSON後的值: $json_str "; length=" strlen($json_str)); ? }
}
$test_data = array( w => phppan => => ); //序列化數組
echo 數組 <br /> ; Foo::pare_serialize_and_json($test_data);
$foo = new Foo(); echo 對象:<br /> ; Foo::pare_serialize_and_json($foo);
輸出
復制代碼 代碼如下: 數組 序列化後的值:a: :{s: :"w";i: ;s: :"phppan";i: ;s: :"";i: ;}; length= JSON後的值:{"w": "phppan": "": }; length= 對象: 序列化後的值:O: :"Foo": :{s: :"int";i: ;s: :"bool";b: ;s: :"array";a: :{i: ; ? a: :{i: ;i: ;}i: ;s: :"test";i: ;s: :"string";}}; length= JSON後的值:{"int": "bool":true "array":{" ":[ ] " ":"test" " ":"string"}}; length=很明顯的長度區別 serialize在編碼後大概是json的兩倍
原因
?serialize後字符串包含了子串的長度 這可能是速度方面的優化 典型的空間換時間 但是它本身還是太重了 ?serialize有更加詳細的類型區分 而json只有四種類型 並且是以簡單的符號表示
速度的比較
以代碼說明問題 如下比較速度的代碼
復制代碼 代碼如下: $max_index = ; ini_set("memory_limit" " M"); $array = array_fill( rand( ));echo serialize <br /> ; $start = xdebug_time_index(); for ($i = ;? $i < $max_index; $i++) { ? $str = serialize($array); } $end = xdebug_time_index(); echo $end $start <br /> ;
echo json <br /> ; $start = xdebug_time_index(); for ($i = ;? $i < $max_index; $i++) { ? $str = json_encode($array); } $end = xdebug_time_index(); echo $end $start <br /> ; unset($array $str);
輸出
復制代碼 代碼如下: serialize jsonserialize的速度在大數據量的情況下比json差了快壹個數量級
從上面兩點看 json不管是在速度還是在生成的字符串的大小上都比serialize要好 那為什麽serialize還要存在呢? 原因在下面這個點 實現的功能
處理對象
如下代碼
復制代碼 代碼如下: header("Content type:text/;charset=utf "); class Foo { public function test($flag) { ? echo $flag test function for Foo <br /> ; ? } }$foo = new Foo();
echo 反序列化測試 <br /> ; $foo >test( ); $serialize_str = serialize($foo); $obj = unserialize($serialize_str); $obj >test( );
$foo >test( ); $json_str = json_encode($foo); $obj = json_decode($json_str); $obj >test( ); die();
輸出
復制代碼 代碼如下: 反序列化測試 test function for Foo test function for Foo test function for Foo( ! ) Fatal error: Call to undefined method stdClass::test()
json無法處理對象方法等數據
使用範圍
lishixinzhi/Article/program/PHP/201311/20931