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程序中的常见漏洞进行攻击(下)
Oct 09 PHP
超级简单的发送邮件程序
Oct 09 PHP
php 引用(&amp;)详解
Nov 20 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
理解php Hash函数,增强密码安全
Feb 25 PHP
php文件上传的简单实例
Oct 19 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
Mar 17 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
PHP 数组基本操作方法详解
Jun 17 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
使用PHPExcel导出Excel表
Sep 08 PHP
PHP迭代器和生成器用法实例分析
Sep 28 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
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
newxtree.js代码
2007/03/13 Javascript
js分页代码分享
2014/04/28 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
目标责任书范文
2014/04/14 职场文书
社区文明倡议书
2015/04/28 职场文书
公安机关起诉意见书
2015/05/20 职场文书
入党团支部推荐意见
2015/06/02 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫