亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

php語言

php中序列化和json使用方法

時間:2024-10-28 12:46:46 php語言 我要投稿
  • 相關(guān)推薦

php中序列化和json使用方法

  導(dǎo)語:序列化是將對象狀態(tài)轉(zhuǎn)換為可保持或可傳輸?shù)母袷降倪^程。與序列化相對的是反序列化,它將流轉(zhuǎn)換為對象。這兩個過程結(jié)合起來,可以輕松地存儲和傳輸數(shù)據(jù)。下面的是百分網(wǎng)小編為大家搜集的php中序列化和json使用方法,希望對你有所幫助。

  【序列化的概念】

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

  通常,對象實(shí)例的所有字段都會被序列化,這意味著數(shù)據(jù)會被表示為實(shí)例的序列化數(shù)據(jù)。這樣,能夠解釋該格式的代碼有可能能夠確定這些數(shù)據(jù)的值,而不依 賴于該成員的可訪問性。類似地,反序列化從序列化的表示形式中提取數(shù)據(jù),并直接設(shè)置對象狀態(tài),這也與可訪問性規(guī)則無關(guān)。 對于任何可能包含重要的安全性數(shù)據(jù)的對象,如果可能,應(yīng)該使該對象不可序列化。如果它必須為可序列化的,請嘗試生成特定字段來保存不可序列化的重要數(shù)據(jù)。 如果無法實(shí)現(xiàn)這一點(diǎn),則應(yīng)注意該數(shù)據(jù)會被公開給任何擁有序列化權(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語言標(biāo)準(zhǔn) 衍生而來的。JSON的設(shè)計(jì)目標(biāo)是使它成為小的、輕便的、文本的,而且是JavaScript的一個子集。

  【長度的比較】

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

  復(fù)制代碼 代碼如下:

  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);

  輸出:

  復(fù)制代碼 代碼如下:

  數(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有更加詳細(xì)的類型區(qū)分,而json只有四種類型,并且是以簡單的符號表示。

  【速度的比較】

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

  復(fù)制代碼 代碼如下:

  $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);

  輸出:

  復(fù)制代碼 代碼如下:

  serialize:

  9.5371007919312

  json:

  1.4313209056854

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

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

  【處理對象】

  如下代碼:

  復(fù)制代碼 代碼如下:

  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();

  輸出:

  復(fù)制代碼 代碼如下:

  反序列化測試:

  1test function for Foo

  2test function for Foo

  1test function for Foo

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

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

  【使用范圍】

  ?序列化使用serialize,特別是對象的存儲。這是其存在的意義。

  ?與對象無關(guān)的數(shù)據(jù)存儲可以使用json,如包含大量數(shù)字的數(shù)組等。只是當(dāng)遇到這種情況,我們需要做的可能是重構(gòu)數(shù)據(jù)庫了。

  ?數(shù)據(jù)交換時使用JSON,這也是其定義所在。

  ?目前JSON是能用于UTF-8編碼的數(shù)據(jù)。

【php中序列化和json使用方法】相關(guān)文章:

PHP中trait的使用方法08-20

PHP使用中數(shù)據(jù)庫使用方法05-21

php中的daddslashes()和saddslashes()的區(qū)別08-24

PHP autoload函數(shù)的使用方法10-22

PHP校驗(yàn)ISBN碼函數(shù)的使用方法10-25

Java編程中throw和throws子句的使用方法08-26

PHP中超全局變量$GLOBALS和global的區(qū)別09-05

PHP中多態(tài)如何實(shí)現(xiàn)09-04

PHP中實(shí)現(xiàn)頁面跳轉(zhuǎn)07-06

PHP中this關(guān)鍵字06-08