总结对比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 相关文章推荐
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
pdo中使用参数化查询sql
Aug 11 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
Laravel5中Cookie的使用详解
May 03 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
PHP数据库操作三:redis用法分析
Aug 16 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
PHP中命名空间的使用例子
Mar 22 PHP
php集成开发环境详解
Sep 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
php中hashtable实现示例分享
2014/02/13 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
python查看微信好友是否删除自己
2016/12/19 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
Python中装饰器学习总结
2018/02/10 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
python剪切视频与合并视频的实现
2020/03/03 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
迪拜航空官方网站:flydubai
2017/04/20 全球购物
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
超市采购员岗位职责
2014/02/01 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
2015年清明节活动总结
2015/02/09 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
Python基础知识之变量的详解
2021/04/14 Python
python自然语言处理之字典树知识总结
2021/04/25 Python
Python内置数据结构列表与元组示例详解
2021/08/04 Python
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS