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 相关文章推荐
将数字格式的计算结果转为汉字格式
Oct 09 PHP
真正的ZIP文件操作类(php)
Jul 21 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
Nov 11 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 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 冒泡排序算法的实现代码
2010/08/08 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
javascript 节点排序 2
2011/01/31 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
python读文件逐行处理的示例代码分享
2013/12/27 Python
使用tensorflow实现AlexNet
2017/11/20 Python
python使用tkinter实现简单计算器
2018/01/30 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
联想新西兰官方网站:Lenovo New Zealand
2018/10/30 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
关于旷工的检讨书
2014/02/02 职场文书
防火标语大全
2014/10/06 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
javascript函数式编程基础
2021/09/15 Javascript
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python