总结对比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 相关文章推荐
PHP的分页功能
Mar 21 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
php轻松实现中英文混排字符串截取
May 28 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
PHP面向对象之后期静态绑定功能介绍
May 18 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP常见数组排序方法小结
Aug 20 PHP
PHP实现断点续传乱序合并文件的方法
Sep 06 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
学习php笔记 字符串处理
2010/10/19 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
angular5 httpclient的示例实战
2018/03/12 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
python中cPickle用法例子分享
2014/01/03 Python
实例Python处理XML文件的方法
2015/08/31 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
python实现最短路径的实例方法
2020/07/19 Python
印度服装购物网站:Limeroad
2018/09/26 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
大四学生毕业自荐信
2013/11/07 职场文书
高中自我鉴定
2013/12/20 职场文书
护士思想汇报
2014/01/12 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
学校教师安全责任书
2014/07/23 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
人民检察院起诉书
2015/05/20 职场文书
刑事申诉状范文
2015/05/20 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
OpenCV实现常见的四种图像几何变换
2022/04/01 Python