PHP多种序列化/反序列化的方法详解


Posted in PHP onJune 23, 2017

摘要:序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性..

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。

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 => Coconut )
 
?>
//反序列化
$o = unserialize($s);
print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana => Coconut )
?>

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。

$obj = array();
//序列化
$s = base64_encode(serialize($obj));
//反序列化
$original = unserialize(base64_decode($s));

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。

//定义一个用来序列化对象的函数
 function my_serialize( $obj )
{
  return base64_encode(gzcompress(serialize($obj)));
}
//反序列化
function my_unserialize($txt)
{
  return unserialize(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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
php stream_get_meta_data返回值
Sep 29 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
PHP图像处理类库及演示分享
May 17 PHP
PHP使用逆波兰式计算工资的方法
Jul 29 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
详解php框架Yaf路由重写
Jun 20 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
PHP后端银联支付及退款实例代码
Jun 23 #PHP
PHP单例模式简单用法示例
Jun 23 #PHP
php处理静态页面:页面设置缓存时间实例
Jun 22 #PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 #PHP
用PHP去掉文件头的Unicode签名(BOM)方法
Jun 22 #PHP
PHP简单装饰器模式实现与用法示例
Jun 22 #PHP
PHP实现的简单适配器模式示例
Jun 22 #PHP
You might like
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
领悟php接口中interface存在的意义
2013/06/27 PHP
php计算数组不为空元素个数的方法
2014/01/27 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
PHP错误机制知识汇总
2016/03/24 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
javascript里使用php代码实例
2014/12/13 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
python中int与str互转方法
2018/07/02 Python
pandas去除重复列的实现方法
2019/01/29 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
《桂林山水》教学反思
2014/02/08 职场文书
企业口号大全
2014/06/12 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
中班下学期个人总结
2015/02/12 职场文书
教师工作能力自我评价
2015/03/04 职场文书
家庭贫困证明
2015/06/16 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS