php 中序列化和json使用介紹
【序列化的概念】
序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或可傳輸?shù)母袷降倪^(guò)程。與序列化相對(duì)的是反序列化,它將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過(guò)程結(jié)合起來(lái),可以輕松地存儲(chǔ)和傳輸數(shù)據(jù)。
將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)拇绑w的過(guò)程。 在序列化期間,對(duì)象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲(chǔ)區(qū)。以后,可以通過(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。
通常,對(duì)象實(shí)例的所有字段都會(huì)被序列化,這意味著數(shù)據(jù)會(huì)被表示為實(shí)例的序列化數(shù)據(jù)。這樣,能夠解釋該格式的代碼有可能能夠確定這些數(shù)據(jù)的值,而不依賴于該成員的可訪問(wèn)性。類似地,反序列化從序列化的表示形式中提取數(shù)據(jù),并直接設(shè)置對(duì)象狀態(tài),這也與可訪問(wèn)性規(guī)則無(wú)關(guān)。 對(duì)于任何可能包含重要的安全性數(shù)據(jù)的對(duì)象,如果可能,應(yīng)該使該對(duì)象不可序列化。如果它必須為可序列化的,請(qǐng)嘗試生成特定字段來(lái)保存不可序列化的重要數(shù)據(jù)。如果無(wú)法實(shí)現(xiàn)這一點(diǎn),則應(yīng)注意該數(shù)據(jù)會(huì)被公開(kāi)給任何擁有序列化權(quán)限的代碼,并確保不讓任何惡意代碼獲得該權(quán)限。
【JSON的概念】
JSON,JavaScript Object Notation,一種更輕、更友好的用于接口(AJAX、REST等)數(shù)據(jù)交換的格式。 JSON是結(jié)構(gòu)化數(shù)據(jù)串行化的文本格式,作為XML的一種替代品,用于表示客戶端與服務(wù)器間數(shù)據(jù)交換有效負(fù)載的格式。它是從ECMAScript語(yǔ)言標(biāo)準(zhǔn)衍生而來(lái)的。JSON的設(shè)計(jì)目標(biāo)是使它成為小的、輕便的、文本的,而且是JavaScript的一個(gè)子集。
【長(zhǎng)度的比較】
如下一段代碼,顯示了對(duì)數(shù)組和對(duì)象編碼后生成的字符串及其長(zhǎng)度
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 '對(duì)象:<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
對(duì)象:
序列化后的值: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
很明顯的長(zhǎng)度區(qū)別,serialize在編碼后大概是json的兩倍。
原因:
•serialize后字符串包含了子串的長(zhǎng)度,這可能是速度方面的優(yōu)化,典型的空間換時(shí)間,但是它本身還是太重了。
•serialize有更加詳細(xì)的類型區(qū)分,而json只有四種類型,并且是以簡(jiǎn)單的符號(hào)表示。
【速度的比較】
以代碼說(shuō)明問(wèn)題,如下比較速度的代碼:
$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差了快一個(gè)數(shù)量級(jí)。
從上面兩點(diǎn)看,json不管是在速度還是在生成的字符串的大小上都比serialize要好,那為什么serialize還要存在呢? 原因在下面這個(gè)點(diǎn):實(shí)現(xiàn)的功能。
【處理對(duì)象】
如下代碼:
header("Content-type:text/html;charset=utf8");
class Foo {
public function test($flag) {
echo $flag, 'test function for Foo <br />';
}
}
$foo = new Foo();
echo '反序列化測(cè)試:<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();
輸出:
反序列化測(cè)試:
1test function for Foo
2test function for Foo
1test function for Foo
( ! ) Fatal error: Call to undefined method stdClass::test()
json無(wú)法處理對(duì)象方法等數(shù)據(jù)。
【使用范圍】
•序列化使用serialize,特別是對(duì)象的存儲(chǔ)。這是其存在的意義。
•與對(duì)象無(wú)關(guān)的數(shù)據(jù)存儲(chǔ)可以使用json,如包含大量數(shù)字的數(shù)組等。只是當(dāng)遇到這種情況,我們需要做的可能是重構(gòu)數(shù)據(jù)庫(kù)了。
•數(shù)據(jù)交換時(shí)使用JSON,這也是其定義所在。
•目前JSON是能用于UTF-8編碼的數(shù)據(jù)。
- JSON PHP中,Json字符串反序列化成對(duì)象/數(shù)組的方法
- PHP中SERIALIZE和JSON的序列化與反序列化操作區(qū)別分析
- PHP的serialize序列化數(shù)據(jù)以及JSON格式化數(shù)據(jù)分析
- php json與xml序列化/反序列化
- php中serialize序列化與json性能測(cè)試的示例分析
- js解析與序列化json數(shù)據(jù)(一)json.stringify()的基本用法
- jquery序列化form表單使用ajax提交后處理返回的json數(shù)據(jù)
- js解析與序列化json數(shù)據(jù)(二)序列化探討
- Json序列化和反序列化方法解析
- php中json?序列化為?[]?的弊端
相關(guān)文章
get post jsonp三種數(shù)據(jù)交互形式實(shí)例詳解
本文通過(guò)實(shí)例給大家詳細(xì)介紹了get post jsonp三種數(shù)據(jù)交互形式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-08-08微信小程序?qū)崿F(xiàn)簡(jiǎn)單的購(gòu)物車功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡(jiǎn)單的購(gòu)物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07詳解使用fetch發(fā)送post請(qǐng)求時(shí)的參數(shù)處理
這篇文章主要介紹了詳解使用fetch發(fā)送post請(qǐng)求時(shí)的參數(shù)處理的相關(guān)資料,需要的朋友可以參考下2017-04-04Bootstrap導(dǎo)航欄各元素操作方法(表單、按鈕、文本)
這篇文章主要介紹了Bootstrap導(dǎo)航欄各元素操作方法,針對(duì)表單、按鈕、文本進(jìn)行操作,感興趣的小伙伴們可以參考一下2015-12-12Javascript數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解
要了解JavaScript數(shù)組的堆棧和隊(duì)列方法的操作,需要先對(duì)堆棧和隊(duì)列基礎(chǔ)知識(shí)有所了解,下面這篇文章主要給大家介紹了關(guān)于Javascript數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05JavaScript reduce和reduceRight詳解
這篇文章主要介紹了JavaScript reduce和reduceRight的高級(jí)用法詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10微信小程序bindtap與catchtap的區(qū)別詳解
本文主要介紹了微信小程序bindtap與catchtap的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09JavaScript實(shí)現(xiàn)換膚效果(換背景)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)換膚效果,即換背景功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09