解析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 相关文章推荐
数字转英文
Dec 06 PHP
php echo 输出字符串函数详解
May 13 PHP
apache php模块整合操作指南
Nov 16 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 PHP
PHP实现的日历功能示例
Sep 01 PHP
php json转换相关知识(小结)
Dec 21 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
php获取是星期几的的一些常用姿势
Dec 15 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简单提示框alert封装函数
2010/08/08 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
微信支付扫码支付php版
2016/07/22 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
python原始套接字编程示例分享
2014/02/21 Python
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
深入解析Python中的urllib2模块
2015/11/13 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
python and or用法详解
2019/06/26 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
python的数学算法函数及公式用法
2020/11/18 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
美国家居装饰店:Pier 1
2019/09/04 全球购物
大学生职业规划论文
2014/01/11 职场文书
施工协议书范本
2014/04/22 职场文书
特岗教师个人总结
2015/02/10 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python