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 相关文章推荐
php注入实例
Oct 09 PHP
php实现mysql数据库备份类
Mar 20 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
学习使用curl采集curl使用方法
Jan 11 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
解析zend studio中直接导入svn中的项目的方法步骤
Jun 21 PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 PHP
php计算函数执行时间的方法
Mar 20 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
PHP生成图表pChart的示例解析
Jul 31 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
php minixml详解
2008/07/19 PHP
php error_log 函数的使用
2009/04/13 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
PHP实现计算器小功能
2020/08/28 PHP
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
vue实现评论列表功能
2019/10/25 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
浅谈Python中的私有变量
2018/02/28 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
初中军训感想300字
2014/03/05 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
警示教育活动总结
2014/05/05 职场文书
学校周年庆活动方案
2014/08/22 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
小学生表扬稿范文
2015/05/05 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技