序列化是将变量装换为可保存或传输的字符串的过程;
反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
$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 格式序列化和反序列化是一个不错的选择:
$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] => 中国
)
$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 函数可以序列化数组变量,并以 XML 字符串形式输出。
$arr = [
'name' => '小明',
'age' => 21,
'country' => "中国",
];
$s = wddx_serialize_value($arr);
$obj = wddx_deserialize($s);
echo $s;
echo "\n";
print_r($obj);
输出结果:
小明 21 中国
Array
(
[name] => 小明
[age] => 21
[country] => 中国
)
参考文章:PHP多种序列化/反序列化的方法