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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
Zend Framework教程之模型Model用法简单实例
Mar 04 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 PHP
php接口技术实例详解
Dec 07 PHP
php use和include区别总结
Oct 13 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
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
解析php入库和出库
2013/06/25 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
vuex的使用步骤
2021/01/06 Vue.js
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
国培远程培训感言
2014/03/08 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书