解析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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
PHP自毁程序(慎用)
Jul 09 PHP
PHP实现C#山寨ArrayList的方法
Jul 16 PHP
举例详解PHP脚本的测试方法
Aug 05 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
Yii中表单用法实例详解
Jan 05 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP使用两个栈实现队列功能的方法
Jan 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中count获取多维数组长度的方法
2014/11/03 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
python求素数示例分享
2014/02/16 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python try 异常处理(史上最全)
2019/03/07 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
python 如何上传包到pypi
2020/12/24 Python
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
电子信息专业应届生自荐信
2014/06/04 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
领导干部考核评语
2015/01/04 职场文书
民事辩护词范文
2015/05/21 职场文书
导游词之千岛湖
2019/09/23 职场文书