解析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 和 MySQL 基础教程(二)
Oct 09 PHP
获得Google PR值的PHP代码
Jan 28 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
phalcon框架使用指南
Feb 23 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
Thinkphp 框架扩展之类库扩展操作详解
Apr 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 APC配置文件2套和参数详解
2014/06/11 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
PHP使用逆波兰式计算工资的方法
2015/07/29 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
python访问抓取网页常用命令总结
2017/04/11 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
python 自动重连wifi windows的方法
2018/12/18 Python
Python中logging实例讲解
2019/01/17 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
python 命令行传入参数实现解析
2019/08/30 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
如何基于Python按行合并两个txt
2020/11/03 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
医学专业大学生求职信
2014/07/12 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
北京爱情故事观后感
2015/06/12 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers
MySQL 原理与优化之Update 优化
2022/08/14 MySQL