解析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 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
杏林同学录(三)
Oct 09 PHP
动态生成gif格式的图像要注意?
Oct 09 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
Jun 06 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
php四种基础算法代码实例
Oct 29 PHP
PHP变量内存分配问题记录整理
Nov 27 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 PHP
laravel实现于语言包的完美切换方法
Sep 29 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
基于Javascript倒计时效果
2016/12/22 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
javascript 中null和undefined区分和比较
2017/04/19 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python sorted函数的小练习及解答
2019/09/18 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
关键字final的用法
2013/10/02 面试题
盛大笔试题
2016/11/05 面试题
什么是SCM(软件配置管理)
2014/08/16 面试题
工作表现自我评价
2014/02/08 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
生产文员岗位职责
2014/04/05 职场文书
党员政治学习材料
2014/05/14 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
房屋买卖协议样本
2014/11/16 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
css3带你实现3D转换效果
2022/02/24 HTML / CSS