解析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 相关文章推荐
编写自己的php扩展函数
Oct 09 PHP
PHP爆绝对路径方法收集整理
Sep 17 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
Jun 30 PHP
php上传文件问题汇总
Jan 30 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 PHP
PHP基于递归算法解决兔子生兔子问题
May 11 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
Oct 21 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
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
相对路径转化成绝对路径
2007/04/10 PHP
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
PHP代码优化之成员变量获取速度对比
2014/02/28 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
Python lambda和Python def区别分析
2014/11/30 Python
Python实现将xml导入至excel
2015/11/20 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
社团招新策划书
2014/02/04 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
英文演讲稿
2014/05/15 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
2014年度党员自我评议
2014/09/13 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书