文章目录
序列化是将变量装换为可保存或传输的字符串的过程;
反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
- serialize 和 unserialize
<?php
$arr = [
'name' => '小明',
'age' => 21,
'country' => '中国',
];
$s = serialize($arr);
$obj = unserialize($s);
echo $s;
echo "\n";
print_r($obj);
输出结果:
a:3:{s:4:"name";s:6:"小明";s:3:"age";i:21;s:7:"country";s:6:"中国";}
Array
(
[name] => 小明
[age] => 21
[country] => 中国
)
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,使用 base64_encode 和 base64_decode 。
$s = base64_encode(serialize($arr));
$obj = unserialize(base64_decode($s));
但是 base64 编码将增加字符串的长度。为了克服这个问题,可以和 gzcompress 一起使用。
$s = base64_encode(gzcompress(serialize($arr)));
$obj = unserialize(gzuncompress(base64_decode($s)));
- json_encode 和 json_decode
使用 JSON 格式序列化和反序列化是一个不错的选择:
- 使用 json_encode 和 json_decode 格式输出要比 serialize 和 unserialize 格式快得多
- JSON 格式是可读的
- JSON 格式比 serialize 返回数据结果小
- JSON 格式是开放的、可移植的。其他语言也可以使用它。
<?php
$arr = [
'name' => '小明',
'age' => 21,
'country' => "中国",
];
$s = json_encode($arr);
$obj = json_decode($s);
echo $s;
echo "\n";
print_r($obj);
输出结果:
{"name":"\u5c0f\u660e","age":21,"country":"\u4e2d\u56fd"}
stdClass Object
(
[name] => 小明
[age] => 21
[country] => 中国
)
- var_export 和 eval
var_export 函数把变量作为一个字符串输出;
eval 把字符串当成 PHP 代码来执行,反序列化得到最初变量的内容。
<?php
$arr = [
'name' => '小明',
'age' => 21,
'country' => "中国",
];
$s = var_export($arr, true);
eval('$obj=' . $s . ';');
echo $s;
echo "\n";
print_r($obj);
输出结果:
array (
'name' => '小明',
'age' => 21,
'country' => '中国',
)
Array
(
[name] => 小明
[age] => 21
[country] => 中国
)
- wddx_serialize_value 和 wddx_deserialize
wddx_serialize_value 函数可以序列化数组变量,并以 XML 字符串形式输出。
<?php
$arr = [
'name' => '小明',
'age' => 21,
'country' => "中国",
];
$s = wddx_serialize_value($arr);
$obj = wddx_deserialize($s);
echo $s;
echo "\n";
print_r($obj);
输出结果:
<wddxPacket version='1.0'><header/><data><struct><var name='name'><string>小明</string></var><var name='age'><number>21</number></var><var name='country'><string>中国</string></var></struct></data></wddxPacket>
Array
(
[name] => 小明
[age] => 21
[country] => 中国
)