解析PHP多种序列化与反序列化的方法


Posted in PHP onJune 06, 2013

序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
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 [c] => Coconut )
?>

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
$obj = array();
//序列化
$s = base64_encode(serialize($obj));
//反序列化
$original = unserialize(base64_decode($s));
但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。
//定义一个用来序列化对象的函数
function my_serialize($obj )
{
   returnbase64_encode(gzcompress(serialize($obj)));
}
//反序列化
function my_unserialize($txt)
{
   returnunserialize(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 接口类与抽象类的实际作用
Nov 26 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
Aug 01 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
Java中final关键字详解
Aug 10 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
PHP中Socket连接及读写数据超时问题分析
Jul 19 PHP
YII框架关联查询操作示例
Apr 29 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
php png失真的原因及解决办法
Oct 24 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 #PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 #PHP
解析如何屏蔽php中的phpinfo()函数
Jun 06 #PHP
深入PHP中慎用双等于(==)的详解
Jun 06 #PHP
解析PHP中如何将数组变量写入文件
Jun 06 #PHP
浅谈PHP强制类型转换,慎用!
Jun 06 #PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 #PHP
You might like
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
JavaScript 参考教程
2006/12/29 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
js实现简单的打印表格
2020/01/15 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
vue全屏事件开发详解
2020/06/17 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
javascript实现随机抽奖功能
2020/12/30 Javascript
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
Python 对象中的数据类型
2017/05/13 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
对pandas中Series的map函数详解
2018/07/25 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
《再见了,亲人》教学反思
2014/02/26 职场文书
演讲稿的写法
2014/05/19 职场文书
教研处工作方案
2014/05/26 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
名人传读书笔记
2015/06/26 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书