总结对比php中的多种序列化


Posted in PHP onAugust 28, 2016

前言

序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能 够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也 与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。 如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

serialize和unserialize函数

这两个是序列化和反序列化PHP中数据的常用函数。有利于存储或传递 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_encodebase64_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)));
}

json_encode 和 json_decode

使用JSON格式序列化和反序列化是一个不错的选择:

使用json_encodejson_decode格式输出要serializeunserialize格式快得多。

     (1) JSON格式是可读的。

     (2) JSON格式比serialize返回数据结果小。

     (3) 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输出长度显然要短。需要注意的是json_encode不能序列化对象。

总结

以上就是这篇文章的全部内容,希望大家能够喜欢并且给大家带来帮助。如果有问题可以留言讨论。

PHP 相关文章推荐
APMServ使用说明
Oct 23 PHP
php $_ENV为空的原因分析
Jun 01 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
php压缩和解压缩字符串的方法
Mar 14 PHP
PHP魔术方法的使用示例
Jun 23 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
Laravel实现表单提交
May 07 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
PHP打印输出函数汇总
Aug 28 #PHP
PHP中include/require/include_once/require_once使用心得
Aug 28 #PHP
PHP常用的三种设计模式汇总
Aug 28 #PHP
Apache PHP MySql安装配置图文教程
Aug 27 #PHP
php微信开发接入
Aug 27 #PHP
php微信开发自定义菜单
Aug 27 #PHP
PHP7新特性foreach 修改示例介绍
Aug 26 #PHP
You might like
PHP4中session登录页面的应用
2008/07/25 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
python pygame实现2048游戏
2018/11/20 Python
Python判断有效的数独算法示例
2019/02/23 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
毕业生精彩的自我评价分享
2013/10/06 职场文书
旅游管理本科生求职信
2013/10/14 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
新郎答谢词
2015/01/04 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
道歉的话怎么说
2015/05/12 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis