PHP 多种序列化/反序列化的方式详解

时间:2020-9-16 作者:admin

文章目录

序列化是将变量装换为可保存或传输的字符串的过程;

反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。

这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。

  1. 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)));
  1. 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] => 中国
)
  1. 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] => 中国
)
  1. 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] => 中国
)

参考文章:PHP多种序列化/反序列化的方法

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。