首頁 > web前端 > js教程 > 主體

php 中序列化和json使用介紹_javascript技巧

WBOY
發布: 2016-05-16 17:29:31
原創
1120 人瀏覽過

【序列化的概念】

序列化是將物件狀態轉換為可保持或可傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為物件。這兩個過程結合起來,可以輕鬆地儲存和傳輸資料。

將物件的狀態資訊轉換為可以儲存或傳送的窗體的過程。 在序列化期間,物件將其目前狀態寫入到臨時或持久性儲存區。以後,可以透過從儲存區讀取或反序列化物件的狀態,重新建立該物件。

通常,物件實例的所有欄位都會被序列化,這表示資料會被表示為實例的序列化資料。這樣,能夠解釋該格式的程式碼有可能能夠確定這些資料的值,而不依賴該成員的可存取性。類似地,反序列化從序列化的表示形式中提取數據,並直接設定物件狀態,這也與可訪問性規則無關。 對於任何可能包含重要的安全性資料的對象,如果可能,應該使該對像不可序列化。如果它必須為可序列化的,請嘗試產生特定欄位來保存不可序列化的重要資料。如果無法實現這一點,則應注意該資料會被公開給任何擁有序列化權限的程式碼,並確保不讓任何惡意程式碼獲得該權限。

【JSON的概念】

JSON,JavaScript Object Notation,一種更輕、更友善的用於介面(AJAX、REST等)資料交換的格式。 JSON是結構化資料串列化的文字格式,作為XML的替代品,用來表示客戶端與伺服器間資料交換有效負載的格式。它是從ECMAScript語言標準衍生而來的。 JSON的設計目標是使它成為小的、輕巧的、文字的,而且是JavaScript的一個子集。

【長度的比較】

如下一段程式碼,顯示了對陣列和物件編碼後產生的字串及其長度

複製程式碼 程式碼如下:

class Foo {

    public $int = 1;
    public $bool = TRUE;
    public $array = array(array(1), 2 => 'test', 'string');

    public function test($flag) {
        echo $flag, 'test function for Foo
';
    }

    public static function output($str) {
        echo $str, '
';
    }

    public static function compare_serialize_and_json($data) {
        $serialize_str =  serialize($data ength=" .
            strlen($serialize_str));

        $json_str = json_encode($data);

        self::output('JSON ); >
}

$test_data = array('wwww' => 0, 'phppan' => 1, 'com' => 2);

//序列化陣列

echo '陣列:
';
Foo::compare_serialize_and_json($test_data);

$foo = new Foo();
echo '物件:
';

Foo::compare_serialize_and_json($foo);




輸出:

複製程式碼 程式碼如下:陣列:
序列化後的值:a :3:{s:4:"wwww";i:0;s:6:"phppan";i:1;s:3:"com";i:2;}; length=52
JSON後的值:{"wwww":0,"phppan":1,"com":2}; length=29
物件:
序列化後的值:O:3:"Foo":3: {s:3:"int";i:1;s:4:"bool";b:1;s:5:"array";a:3:{i:0;
    a:1:{ i:0;i:1;}i:2;s:4:"test";i:3;s:6:"string";}}; length=111
JSON後的值:{"int ":1,"bool":true,"array":{"0":[1],"2":"test","3":"string"}}; length=63



很明顯的長度區別,serialize在編碼後大概是json的兩倍。
原因:

•serialize後字串包含了子字串的長度,這可能是速度方面的最佳化,典型的空間換時間,但是它本身還是太重了。

•serialize有更詳細的類型區分,而json只有四種類型,並且是以簡單的符號表示。

【速度的比較】

以程式碼說明問題,如下比較速度的程式碼:

複製程式碼 程式碼如下:

$max_index = 10;
ini_set("memory_limit","512M");
$array = array_fill(0, 1000000, rand(1, 9999));echo 'serialize:
';

$start = xdebug_time_index();
for ($i = 0;  $i    $str = serialize $str = serialize ($array);
}
$end = xdebug_time_index();
echo $end - $start, '
';

echo 'json:
';

$start = xdebug_time_index();
for ($i = 0;  $i    $str = json_encode = json_encode ($array);
}
$end = xdebug_time_index();
echo $end - $start, '
';
unset($array, $str);

輸出:

複製程式碼 代碼如下:
serialize:9.53710799. 🎜>1.4313209056854



serialize的速度在大數據量的情況下比json差了快一個數量級。
從上面兩點看,json不管是在速度還是在生成的字串的大小上都比serialize要好,那為什麼serialize還要存在呢? 原因在下面這個點:實現的功能。

【處理對象】

如下碼:

複製程式碼

程式碼如下:header("Content-type:text/html; =utf8");class Foo {
     public function test($flag) {
        echo $flag, 'test function for Foo
'; >
$foo = new Foo();

echo '反序列化檢定:
';
$foo->test(1);
$serialize_str = serialize($foo);
$obj = unserialize($serialize_str );$obj->test(2);

$foo->test(1);

$json_str = json_encode($foo);
$obj = json_decode($json_str);
$obj->test(2);
die();


輸出:



複製程式碼

程式碼如下:

反序列化檢定:1test function for Foooo 2test function for Foo1test function for Foo ( ! ) Fatal error: Call to undefined method stdClass::test()


json無法處理物件方法等資料。

【使用範圍】

•序列化使用serialize,特別是物件的儲存。這是其存在的意義。
•與物件無關的資料儲存可以使用json,例如包含大量數字的陣列等。只是當遇到這種情況,我們需要做的可能是重構資料庫了。

•資料交換時使用JSON,這也是其定義所在。 •目前JSON是能用於UTF-8編碼的資料。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板