PHP 中的序列化函式

Sheeraz Gul 2023年1月30日
  1. 在 PHP 中演示對一維陣列使用 serialize()unserialize()
  2. 在 PHP 中演示對多維陣列使用 Serialize()Unserialize()
  3. PHP 中 Serialize()json_encode() 的區別
PHP 中的序列化函式

PHP serialize() 用於將複雜的資料結構轉換為特定字串的格式,以便我們可以在執行的 PHP 指令碼之外使用它們。

簡單地說,serialize() 用於將資料結構放入 lower common denominator,以便在文字檔案、套接字或資料庫中使用它們。

本教程演示了 serialize()unserialize() 的使用。

在 PHP 中演示對一維陣列使用 serialize()unserialize()

PHP serialize() 只接受一個引數,即你要序列化的值,unserialize() 也是如此。參見示例:

<?php
$demo_array = array("delftstack1", "delftstack3", "delftstack3");
//serialize one dimensional array
$serialized_data = serialize($demo_array);
echo $serialized_data."<br>";
//Userialize the serialized array
$Unserialized_data = unserialize($serialized_data);
print_r($Unserialized_data);
echo "<br><br>";

//serialize an assosiative array
$demo_array= array( 'Val1' => 'delftstack1', 'Val2'=> 'delftstack3', 'Val3'=>'delftstack3');
$serialized_data = serialize($demo_array);
echo $serialized_data."<br>";
//Userialize the serialized array
$Unserialized_data = unserialize($serialized_data);
print_r($Unserialized_data);
?>

PHP serialize() 一個簡單陣列和一個關聯陣列,然後通過 unserialize() 反轉操作。

輸出:

a:3:{i:0;s:11:"delftstack1";i:1;s:11:"delftstack3";i:2;s:11:"delftstack3";}
Array ( [0] => delftstack1 [1] => delftstack3 [2] => delftstack3 )

a:3:{s:4:"Val1";s:11:"delftstack1";s:4:"Val2";s:11:"delftstack3";s:4:"Val3";s:11:"delftstack3";}
Array ( [Val1] => delftstack1 [Val2] => delftstack3 [Val3] => delftstack3 )

序列化生成一個字串,其中包含給定陣列的所有資料。序列化字串,陣列的 a=size,陣列編號的 i=count,陣列值的 s=size

輸出顯示,如果陣列不是關聯的,serialize 仍將根據關聯陣列生成輸出。

在 PHP 中演示對多維陣列使用 Serialize()Unserialize()

對於多維陣列,輸出將是相似的。

<?php
$multidimentional_array= array(
    array(
        array("delftstack1", 10, 15.5),
        array("delftstack2", 15, 25.5)
       ),
    array(
        array("delftstack1", 15, 25.5),
        array("delftstack2", 20, 30.5)
       ),
    array(
        array("delftstack1", 20, 30.5),
        array("delftstack2", 30, 35.5) 
    )
);
//serialize one dimensional array
$serialized_data = serialize($multidimentional_array);
echo $serialized_data."<br><br><br>";
//Userialize the serialized array
$Unserialized_data = unserialize($serialized_data);
print_r($Unserialized_data);
?>

輸出:

a:3:{i:0;a:2:{i:0;a:3:{i:0;s:11:"delftstack1";i:1;i:10;i:2;d:15.5;}i:1;a:3:{i:0;s:11:"delftstack2";i:1;i:15;i:2;d:25.5;}}i:1;a:2:{i:0;a:3:{i:0;s:11:"delftstack1";i:1;i:15;i:2;d:25.5;}i:1;a:3:{i:0;s:11:"delftstack2";i:1;i:20;i:2;d:30.5;}}i:2;a:2:{i:0;a:3:{i:0;s:11:"delftstack1";i:1;i:20;i:2;d:30.5;}i:1;a:3:{i:0;s:11:"delftstack2";i:1;i:30;i:2;d:35.5;}}}


Array ( [0] => Array ( [0] => Array ( [0] => delftstack1 [1] => 10 [2] => 15.5 ) [1] => Array ( [0] => delftstack2 [1] => 15 [2] => 25.5 ) ) [1] => Array ( [0] => Array ( [0] => delftstack1 [1] => 15 [2] => 25.5 ) [1] => Array ( [0] => delftstack2 [1] => 20 [2] => 30.5 ) ) [2] => Array ( [0] => Array ( [0] => delftstack1 [1] => 20 [2] => 30.5 ) [1] => Array ( [0] => delftstack2 [1] => 30 [2] => 35.5 ) ) )

PHP 中 Serialize()json_encode() 的區別

json_encode() 是 PHP 中另一個將陣列或物件轉換為字串的內建方法,它使用 JSON 來執行操作,類似地,對於 unserialize()json_decode() 可以用過的。

serialize()json_encode() 之間有一些區別。

  • Serialize() 通常比 json_encode() 快。
  • JSON 更便攜。
  • 對於 UTF-8 字元,你不需要在 serialize() 中執行任何操作,但使用 json_encode() 你需要新增一個額外引數 JSON_UNESCAPED_UNICODE。否則,JSON 會將 UTF-8 轉換為 Unicode 轉義序列。
  • serialize() 有物件的原始類的記憶體,而 JSON 沒有;他們將資料儲存為 stdClass 的例項。

讓我們比較一下 serialize()json_encode()

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

$demo_array= array( 'Val1' => 'delftstack1', 'Val2'=> 'delftstack3', 'Val3'=>'delftstack3');

// `json_encode()` time
$start_time = microtime(true);
json_encode($demo_array);
$json_time = microtime(true) - $start_time;
echo "`json_encode()` encoded the array in $json_time seconds<br>";

// `serialize()` time
$start_time = microtime(true);
serialize($demo_array);
$serialize_time = microtime(true) - $start_time;
echo "`serialize()` serialized the array in $serialize_time seconds<br>";

// Comparing `json_encode()` and `serialize()`
if ($json_time < $serialize_time) {
    printf("json_encode() is %01.2f%% faster than serialize() for this array<br>", ($serialize_time / $json_time - 1) * 100);
}
else if ($serialize_time < $json_time ) {
    printf("serialize() is %01.2f%% faster than json_encode() for this array<br>", ($json_time / $serialize_time - 1) * 100);
} else {
    echo "Cannot Compare!<br>";
}
?>

輸出:

`json_encode()` encoded the array in 4.0531158447266E-6 seconds
`serialize()` serialized the array in 2.1457672119141E-6 seconds
serialize() is 88.89% faster than json_encode() for this array

正如我們所見,對於給定的陣列,serialize()json_encode 快 88.89%。

通常 serialize() 是較快的一種,但有時 json_encode() 可以執行得更快但餘量非常低。

作者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook