首頁 後端開發 php教程 PHP中SERIALIZE與JSON的序列化與反序列化操作差異分析

PHP中SERIALIZE與JSON的序列化與反序列化操作差異分析

Dec 20, 2016 pm 03:35 PM
序列化

本文實例講述了PHP中SERIALIZE和JSON的序列化與反序列化操作差異。分享給大家供大家參考,具體如下:

PHP中SERIALIZE和JSON序列化與反序列化區別是什麼呢,對於這個問題我們可以和小編一起來看看,具體的操作細節如下所示。

在PHP中,serialize和json兩種方式對一個物件或陣列進行序列化或反序列化有什麼區別呢?

假設一個物件和一個陣列:

$web = new stdClass;
$web->site = 'tantengvip';
$web->owner = 'tuntun';
$web->age = 5;
//和
$web = array();
$web['site'] = 'tantengvip';
$web['owner'] = 'tuntun';
$web['age'] = 5;
登入後複製

對它們分別用serialize函數和unserialize函數進行序列化和反序列化,看看列印結果分別是什麼,如下:

使用serialize方式:

reee

結果:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web)));
登入後複製

使用json方式:

string 'O:8:"stdClass":3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=87)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5
登入後複製

結果:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web),true));
登入後複製

我們發現,對於前面定義的這樣一個對像或數組,用serialize和json進行序列化,反序列化回來的結果和原來是一樣的,並沒有什麼區別,除了序列化的格式不同而已.

那麼它們到底有何區別?以下文字總結很好,就不自己加以說明了,可以寫程式驗證。

使用json序列化和反序列化

優勢:

變量序列化後依然可讀

可以給其他系統使用,因為JSON格式是標準的

有效,其他編碼可能不能很好工作

只對stdClass類的示例有效

使用serialize方式序列化和反序列化

優勢:

允許非UTF-8的變量

支持除了stdClass 示例外的變量其他實例

劣勢:

編碼後的文本對人來說是不可讀的

無法被其他語言的系統引用

好,寫個代碼看看:

string 'a:3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=74)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5
登入後複製

結果:

class Test
{
  private $pri = 'pri';
  public $class = 'Test';
  public function __construct()
  {
    $this->class = 'Test construct';
    $this->pri = 'pri construct';
  }
}
$test = new Test();
var_dump(serialize($test));
var_dump(unserialize(serialize($test)));
var_dump(json_encode($test));
var_dump(json_decode(json_encode($test)));
登入後複製

reee json序列化和反序列化失去了類別中的私有成員變量,而serialize序列化和反序列化只要是類別的變數都可以,但是類別的成員方法都無法進行序列化和反序列化。

在一般情況,還是使用json比較好,因為json是跨平台的通用格式,除了json,用xml也比較好。那在什麼時候使用serialize方式呢?

在對一個類別進行serialize反序列化的時候會默認調用魔術方法__wakeUp(),這樣就使得物件能夠重新建立起序列化時未能保留的各種狀態。例如:資料庫連線等。那就是另外一個問題了,這裡不做深究了

希望本文所述對大家PHP程式設計有所幫助。

更多PHP中SERIALIZE和JSON的序列化與反序列化操作區別分析相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在Java中,我們如何使用flexjson序列化物件清單? 在Java中,我們如何使用flexjson序列化物件清單? Sep 05, 2023 pm 11:09 PM

Flexjson是一個輕量級函式庫,用於序列化和反序列化Java物件>和來自JSON格式。我們可以使用JSONSerializer類別的serialize()方法序列化物件清單。此方法可以對目標實例執行淺層序列化。我們需要將清單類型的物件清單作為參數傳遞給serialize()方法。語法publicStringserialize(Objecttarget)範例importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerial

Java序列化如何影響效能? Java序列化如何影響效能? Apr 16, 2024 pm 06:36 PM

序列化对Java性能的影响:序列化过程依赖于反射,会显著影响性能。序列化需要创建字节流存储对象数据,导致内存分配和处理成本。序列化大对象会消耗大量内存和时间。序列化后的对象在网络上传输时会增加负载量。

PHP資料處理技巧:如何使用serialize與unserialize函數實作資料序列化與反序列化 PHP資料處理技巧:如何使用serialize與unserialize函數實作資料序列化與反序列化 Jul 29, 2023 am 10:49 AM

PHP資料處理技巧:如何使用serialize和unserialize函數實現資料序列化與反序列化序列化和反序列化是電腦科學中常用的資料處理技巧之一。在PHP中,我們可以使用serialize()和unserialize()函數來實現資料的序列化和反序列化操作。本文將為您詳細介紹如何使用這兩個函數,並提供相關程式碼範例。一、什麼是序列化和反序列化在電腦編

C++ 函式庫如何進行序列化與反序列化? C++ 函式庫如何進行序列化與反序列化? Apr 18, 2024 am 10:06 AM

C++函式庫序列化和反序列化指南序列化:建立輸出流並將其轉換為存檔格式。將物件序列化到存檔中。反序列化:建立輸入流並將其從存檔格式還原。從存檔中反序列化物件。實戰範例:序列化:建立輸出流。建立存檔物件。建立物件並將其序列化到存檔中。反序列化:建立輸入流。建立存檔物件。建立物件並從存檔中反序列化。

如何使用Java中的Jackson函式庫對屬性的順序進行序列化? 如何使用Java中的Jackson函式庫對屬性的順序進行序列化? Aug 28, 2023 pm 12:45 PM

@JsonPropertyOrder是在類別層級使用的註解。它採用字段列表作為屬性,該列表定義字段在物件JSON序列化生成的字串中出現的順序。可以先序列化註釋聲明中包含的屬性(按定義的順序),然後序列化定義中未包含的任何屬性。語法public@interfaceJsonPropertyOrder範例importcom.fasterxml.jackson.core.*;importcom.fasterxml.jackson.databind.*;importcom.fasterxml.jac

Java 中介面和抽象類別的序列化和反序列化 Java 中介面和抽象類別的序列化和反序列化 May 02, 2024 am 08:33 AM

介面無法直接序列化,抽象類別可以序列化但前提是不包含非靜態、非瞬態欄位或覆寫writeObject()和readObject()方法,具體實例可透過實作介面的具體類別或覆寫writeObject()和readObject ()方法的抽象類別實作。

golang函數類型的序列化與反序列化 golang函數類型的序列化與反序列化 Apr 29, 2024 am 08:15 AM

GoLang函數類型可透過encoding/gob套件實現序列化和反序列化。序列化:註冊自訂類型並使用gob.NewEncoder將函數類型編碼為位元組數組。反序列化:使用gob.NewDecoder從位元組數組反序列化函數類型。

如何使用Java中的flexjson函式庫序列化一個map? 如何使用Java中的flexjson函式庫序列化一個map? Aug 26, 2023 pm 08:13 PM

Flexjson是一個輕量級函式庫,用於將Java物件序列化為JSON格式以及反序列化為JSON格式。我們也可以使用JSONSerializer類別的serialize()方法來序列化Map,它對目標實例執行淺層序列化。語法publicStringserialize(Objecttarget)範例importflexjson.JSONSerializer;importjava.util.*;publicclassJsonSerializeMapTest{  publ

See all articles