解析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 高性能书写
Dec 11 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
php中用socket模拟http中post或者get提交数据的示例代码
Aug 08 PHP
php权重计算方法代码分享
Jan 09 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
PHP整合PayPal支付
Jun 11 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
php爬取天猫和淘宝商品数据
Feb 23 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实现SQL语句格式化功能的方法
2017/07/28 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
Python实现微信好友的数据分析
2019/12/16 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
python实现IOU计算案例
2020/04/12 Python
J2EE面试题集锦(附答案)
2013/08/16 面试题
幼儿教师工作感言
2014/02/14 职场文书
2014年母亲节寄语
2014/05/07 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
邀请函样本
2015/02/02 职场文书
后勤工作个人总结
2015/02/28 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS