PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析


Posted in PHP onOctober 11, 2016

本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别。分享给大家供大家参考,具体如下:

PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们可以和小编一起来看看,具体的操作细节如下所示。

在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢?

假设一个对象和一个数组:

$web = new stdClass;
$web->site = 'tantengvip';
$web->owner = 'tuntun';
$web->age = 5;
//和
$web = array();
$web['site'] = 'tantengvip';
$web['owner'] = 'tuntun';
$web['age'] = 5;

对它们分别用serialize函数和unserialize函数进行序列化和反序列化,看看打印结果分别是什么,如下:

使用serialize方式:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web)));

结果:

string 'O:8:"stdClass":3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=87)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
object(stdClass)[127]
 public 'site' => string 'tantengvip' (length=10)
 public 'owner' => string 'tuntun' (length=6)
 public 'age' => int 5

使用json方式:

var_dump(serialize($web));
var_dump(unserialize(serialize($web)));
var_dump(json_encode($web));
var_dump(json_decode(json_encode($web),true));

结果:

string 'a:3:{s:4:"site";s:10:"tantengvip";s:5:"owner";s:6:"tuntun";s:3:"age";i:5;}' (length=74)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5
string '{"site":"tantengvip","owner":"tuntun","age":5}' (length=46)
array (size=3)
 'site' => string 'tantengvip' (length=10)
 'owner' => string 'tuntun' (length=6)
 'age' => int 5

我们发现,对于前面定义的这样一个对象或数组,用serialize和json进行序列化,反序列化回来的结果和原来是一样的,并没有什么区别,除了序列化的格式不同而已.

那么它们到底有何区别?以下文字总结很好,就不自己加以说明了,可以写代码验证。

使用json序列化和反序列化

优势:

变量序列化后依然可读

可以给其他系统使用,因为JSON格式是标准的

劣势:

只对UFT-8的数据有效,其他编码可能不能很好工作

只对stdClass类的示例有效

使用serialize方式序列化和反序列化

优势:

允许非UTF-8的变量

支持除了stdClass 示例外的其他实例

劣势:

编码后的文本对人来说是不可读的

无法被其他语言的系统引用

好,写个代码看看:

class Test
{
  private $pri = 'pri';
  public $class = 'Test';
  public function __construct()
  {
    $this->class = 'Test construct';
    $this->pri = 'pri construct';
  }
}
$test = new Test();
var_dump(serialize($test));
var_dump(unserialize(serialize($test)));
var_dump(json_encode($test));
var_dump(json_decode(json_encode($test)));

结果:

string 'O:4:"Test":2:{s:9:"�Test�pri";s:13:"pri construct";s:5:"class";s:14:"Test construct";}' (length=86)
object(Test)[127]
 private 'pri' => string 'pri construct' (length=13)
 public 'class' => string 'Test construct' (length=14)
string '{"class":"Test construct"}' (length=26)
object(stdClass)[127]
 public 'class' => string 'Test construct' (length=14)

我们发现,json序列化和反序列化丢失了类中的私有成员变量,而serialize序列化和反序列化只要是类的变量都可以,但是类的成员方法都无法进行序列化和反序列化。

在一般情况,还是使用json比较好,因为json是跨平台的通用格式,除了json,用xml也比较好。那在什么时候使用serialize方式呢?

在对一个类进行serialize反序列化的时候会默认调用魔术方法__wakeUp(),这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。那就是另外一个问题了,这里不做深究了

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Content-type 的说明
Oct 09 PHP
php 全文搜索和替换的实现代码
Jul 29 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
Oct 05 PHP
PHP 循环删除无限分类子节点的实现代码
Jun 21 PHP
php中将数组转成字符串并保存到数据库中的函数代码
Sep 29 PHP
smarty内置函数capture用法分析
Jan 22 PHP
Yii实现Command任务处理的方法详解
Jul 14 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
php 中的closure用法详解
Jun 12 PHP
PHP中cookie知识点学习
May 06 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
php外部执行命令函数用法小结
Oct 11 #PHP
php字符串操作常见问题小结
Oct 11 #PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 #PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 #PHP
php 获取文件行数的方法总结
Oct 11 #PHP
PHP中文字符串截断无乱码解决方法
Oct 10 #PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 #PHP
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
PHP内置加密函数详解
2016/11/20 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
javascript版2048小游戏
2015/03/18 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
几行js代码实现自适应
2017/02/24 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
基于python的字节编译详解
2017/09/20 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
事业单位辞职信范文
2014/01/19 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
新年团拜会主持词
2014/04/02 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
排查MySQL生产环境索引没有效果
2022/04/11 MySQL