熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

php 中序列化和json使用介紹

2022-06-13   來源: PHP編程 

  【序列化的概念】

  序列化是將對象狀態轉換為可保持或可傳輸的格式的過程與序列化相對的是反序列化它將流轉換為對象這兩個過程結合起來可以輕松地存儲和傳輸數據

  將對象的狀態信息轉換為可以存儲或傳輸的窗體的過程 在序列化期間對象將其當前狀態寫入到臨時或持久性存儲區以後可以通過從存儲區中讀取或反序列化對象的狀態重新創建該對象

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

  【JSON的概念】

  JSONJavaScript Object Notation一種更輕更友好的用於接口(AJAXREST等)數據交換的格式 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 compare_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(wwww => phppan => com => );
//序列化數組

  echo 數組<br />;
Foo::compare_serialize_and_json($test_data);

  $foo = new Foo();
echo 對象:<br />;
Foo::compare_serialize_and_json($foo);

  輸出

復制代碼 代碼如下:
數組
序列化後的值:a::{s::"wwww";i:;s::"phppan";i:;s::"com";i:;}; length=
JSON後的值:{"wwww":"phppan":"com":}; 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

json

  serialize的速度在大數據量的情況下比json差了快一個數量級

  從上面兩點看json不管是在速度還是在生成的字符串的大小上都比serialize要好那為什麼serialize還要存在呢? 原因在下面這個點實現的功能

  【處理對象】

  如下代碼

復制代碼 代碼如下:
header("Contenttype:text/html;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無法處理對象方法等數據

  【使用范圍】

  •序列化使用serialize特別是對象的存儲這是其存在的意義
•與對象無關的數據存儲可以使用json如包含大量數字的數組等只是當遇到這種情況我們需要做的可能是重構數據庫了
•數據交換時使用JSON這也是其定義所在
•目前JSON是能用於UTF編碼的數據


From:http://tw.wingwit.com/Article/program/PHP/201311/20931.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.