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 相关文章推荐
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
php自动跳转中英文页面
Jul 29 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
php下mysql数据库操作类(改自discuz)
Jul 03 PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
PHP处理Oracle的CLOB实例
Nov 03 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
对laravel的session获取与存取方法详解
Oct 08 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
js 通用订单代码
2013/12/23 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
Python中正则表达式的用法实例汇总
2014/08/18 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
python文件的md5加密方法
2016/04/06 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
采用怎样的方法保证数据的完整性
2013/12/02 面试题
外企求职信范文分享
2013/12/31 职场文书
项目开发计划书
2014/01/09 职场文书
网络书店创业计划书
2014/02/07 职场文书
职工培训工作总结
2015/08/10 职场文书
工作简历的自我评价
2019/05/16 职场文书