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 相关文章推荐
PHP5 安装方法
Jan 15 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
多个Laravel项目如何共用migrations详解
Sep 25 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
js获取url中"?"后面的字串方法
2014/05/15 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
Ajax的工作原理
2015/12/04 面试题
化学实验员岗位职责
2013/12/28 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
工程款申请报告
2015/05/15 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
Mysql 文件配置解析介绍
2022/05/06 MySQL