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 相关文章推荐
php empty() 检查一个变量是否为空
Nov 10 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
关于php中一些字符串总结
May 05 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
PHP7内核CGI与FastCGI详解
Apr 14 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
PHP+javascript模拟Matrix画面
2006/10/09 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
PyMongo安装使用笔记
2015/04/27 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
python利用opencv保存、播放视频
2020/11/02 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
土木工程专业大学毕业生求职信
2013/10/13 职场文书
大学自我鉴定
2013/12/20 职场文书
大学生党员自我批评
2014/02/14 职场文书
保研推荐信
2014/05/09 职场文书
生产助理岗位职责
2014/06/18 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
小学生大队委竞选稿
2015/11/20 职场文书