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

首頁 > 擴展 > JSON > 正文

php 中序列化和json使用介紹

2024-09-06 20:18:13
字體:
來源:轉載
供稿:網(wǎng)友

【序列化的概念】

序列化是將對象狀態(tài)轉換為可保持或可傳輸?shù)母袷降倪^程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數(shù)據(jù)。

將對象的狀態(tài)信息轉換為可以存儲或傳輸?shù)拇绑w的過程。 在序列化期間,對象將其當前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。

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

【JSON的概念】

JSON,JavaScript Object Notation,一種更輕、更友好的用于接口(AJAX、REST等)數(shù)據(jù)交換的格式。 JSON是結構化數(shù)據(jù)串行化的文本格式,作為XML的一種替代品,用于表示客戶端與服務器間數(shù)據(jù)交換有效負載的格式。它是從ECMAScript語言標準 衍生而來的。JSON的設計目標是使它成為小的、輕便的、文本的,而且是JavaScript的一個子集。

【長度的比較】

如下一段代碼,顯示了對數(shù)組和對象編碼后生成的字符串及其長度

復制代碼 代碼如下:
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 <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' => 0, 'phppan' => 1, 'com' => 2);
//序列化數(shù)組

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

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

輸出:

復制代碼 代碼如下:
數(shù)組:
序列化后的值: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

很明顯的長度區(qū)別,serialize在編碼后大概是json的兩倍。

原因:

•serialize后字符串包含了子串的長度,這可能是速度方面的優(yōu)化,典型的空間換時間,但是它本身還是太重了。
•serialize有更加詳細的類型區(qū)分,而json只有四種類型,并且是以簡單的符號表示。

【速度的比較】

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

復制代碼 代碼如下:
$max_index = 10;
ini_set("memory_limit","512M");
$array = array_fill(0, 1000000, rand(1, 9999));

echo 'serialize:<br />';
$start = xdebug_time_index();
for ($i = 0;  $i < $max_index; $i++) {
    $str = serialize($array);
}
$end = xdebug_time_index();
echo $end - $start, '<br />';

echo 'json:<br />';
$start = xdebug_time_index();
for ($i = 0;  $i < $max_index; $i++) {
    $str = json_encode($array);
}
$end = xdebug_time_index();
echo $end - $start, '<br />';
unset($array, $str);

輸出:

復制代碼 代碼如下:
serialize:
9.5371007919312
json:
1.4313209056854

serialize的速度在大數(shù)據(jù)量的情況下比json差了快一個數(shù)量級。

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

【處理對象】

如下代碼:

復制代碼 代碼如下:
header("Content-type:text/html;charset=utf8");
class Foo {
     public function test($flag) {
        echo $flag, 'test function for Foo <br />';
    }
}

$foo = new Foo();

echo '反序列化測試:<br />';
$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 Foo
2test function for Foo
1test function for Foo

( ! ) Fatal error: Call to undefined method stdClass::test()

json無法處理對象方法等數(shù)據(jù)。

【使用范圍】

共2頁上一頁12下一頁
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 花垣县| 蓝山县| 湖南省| 喀喇| 怀化市| 常山县| 神农架林区| 垫江县| 钟山县| 开封市| 怀仁县| 莱州市| 土默特左旗| 玉树县| 沂源县| 朝阳区| 灵寿县| 博湖县| 安图县| 溧水县| 浮山县| 霸州市| 江门市| 繁昌县| 湘乡市| 忻州市| 拉萨市| 嵊州市| 尖扎县| 荃湾区| 长顺县| 万年县| 龙南县| 洪江市| 金阳县| 遂宁市| 盘山县| 江孜县| 桃园县| 新乐市| 柘荣县|