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 相关文章推荐
提问的智慧(2)
Oct 09 PHP
杏林同学录(九)
Oct 09 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
THINKPHP2.0到3.0有哪些改进之处
Jan 04 PHP
PHP计算日期相差天数实例分析
Feb 23 PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
thinkPHP3.2.2框架行为扩展及demo示例
Jun 19 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
第十二节 类的自动加载 [12]
2006/10/09 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Python发展史及网络爬虫
2019/06/19 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
Python如何将list中的string转换为int
2022/07/15 Ruby
win10搭建配置ftp服务器的方法
2022/08/05 Servers