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 is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
php 伪静态之IIS篇
Jun 02 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
php文件管理基本功能简单操作
Jan 16 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
PHP使用phpunit进行单元测试示例
Sep 23 PHP
PHP的imageTtfText()函数深入详解
Mar 03 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
php无限遍历文件夹示例分享
2014/03/04 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
WordPress网站性能优化指南
2015/11/18 PHP
犀利的js 函数集合
2009/06/11 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
js实现图片360度旋转
2017/01/22 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
django admin 添加自定义链接方式
2020/03/11 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
Puma印度官网:德国运动品牌
2019/10/06 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
企业宣传口号
2014/06/12 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
办公室主任岗位职责
2015/01/31 职场文书
综合办公室岗位职责
2015/04/11 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
python3实现无权最短路径的方法
2021/05/12 Python