解析PHP多种序列化与反序列化的方法


Posted in PHP onJune 06, 2013

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
1. serialize和unserialize函数
这两个是序列化和反序列化PHP中数据的常用函数。

<?php
$a = array('a'=> 'Apple' ,'b' => 'banana', 'c' => 'Coconut');
//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
echo '<br /><br />';
//反序列化
$o = unserialize($s);
print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut )
?>

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
$obj = array();
//序列化
$s = base64_encode(serialize($obj));
//反序列化
$original = unserialize(base64_decode($s));
但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。
//定义一个用来序列化对象的函数
function my_serialize($obj )
{
   returnbase64_encode(gzcompress(serialize($obj)));
}
//反序列化
function my_unserialize($txt)
{
   returnunserialize(gzuncompress(base64_decode($txt)));
}

2. json_encode 和 json_decode
使用JSON格式序列化和反序列化是一个不错的选择:
    使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
    JSON格式是可读的。
    JSON格式比serialize返回数据结果小。
    JSON格式是开放的、可移植的。其他语言也可以使用它。
$a = array('a'=> 'Apple' ,'b' => 'banana', 'c' => 'Coconut');//序列化数组
$s = json_encode($a);
echo $s;
//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}
echo '<br /><br />';
//反序列化
$o = json_decode($s);

在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。
3. var_export 和 eval
var_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。
$a = array('a'=> 'Apple' ,'b' => 'banana', 'c' => 'Coconut');//序列化数组
$s = var_export($a, true);
echo $s;
//输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', )
echo '<br /><br />';
//反序列化
eval('$my_var='. $s . ';');
print_r($my_var);

4. wddx_serialize_value 和 wddx deserialize
wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。
$a = array('a'=> 'Apple' ,'b' => 'banana', 'c' => 'Coconut');//序列化数组
$s = wddx_serialize_value($a);
echo $s;
//输出结果(查看输出字符串的源码):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket>
echo '<br /><br />';
//反序列化
$o = wddx_deserialize($s);
print_r($o);
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )

可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。
小结
上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
PHP 相关文章推荐
main.php
Dec 09 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
php实现可逆加密的方法
Aug 11 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 #PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 #PHP
解析如何屏蔽php中的phpinfo()函数
Jun 06 #PHP
深入PHP中慎用双等于(==)的详解
Jun 06 #PHP
解析PHP中如何将数组变量写入文件
Jun 06 #PHP
浅谈PHP强制类型转换,慎用!
Jun 06 #PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 #PHP
You might like
杏林同学录(三)
2006/10/09 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php类自动加载器实现方法
2015/07/28 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
JavaScript基本对象
2007/01/11 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
python基础教程之udp端口扫描
2014/02/10 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
python上selenium的弹框操作实现
2020/07/13 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
SQL注入攻击的种类有哪些
2013/12/30 面试题
金属材料工程个人求职的自我评价
2013/12/04 职场文书
教师节商场活动方案
2014/02/13 职场文书
学历公证书范本
2014/04/09 职场文书
物业接待员岗位职责
2015/04/15 职场文书
好员工观后感
2015/06/17 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL