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