解析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中取得文件的后缀名?
Feb 20 PHP
用php实现选择排序的解决方法
May 04 PHP
深入php处理整数函数的详解
Jun 09 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
php mysql数据库操作类(实例讲解)
Aug 06 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 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 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
校园活动策划方案
2014/06/13 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
入党积极分子群众意见
2015/06/01 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
Promise面试题详解之控制并发
2021/05/14 面试题
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js