解析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 相关文章推荐
利用文件属性结合Session实现在线人数统计
Oct 09 PHP
php开发工具之vs2005图解
Jan 12 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
zend framework重定向方法小结
May 28 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 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取整数函数常用的四种方法小结
2012/07/05 PHP
PHP单链表的实现代码
2016/07/05 PHP
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
python比较两个列表是否相等的方法
2015/07/28 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python爬取网易云音乐评论
2018/11/16 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
如何使用python进行pdf文件分割
2019/11/11 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
百度JavaScript笔试题
2015/01/15 面试题
Delphi笔试题
2016/11/14 面试题
大学军训感言600字
2014/02/25 职场文书
职代会闭幕词
2015/01/28 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
中学团支部工作总结
2015/08/13 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python