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中的多态性[译]
Aug 02 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
php过滤XSS攻击的函数
Nov 12 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
Yii全局函数用法示例
Jan 22 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
WordPress伪静态规则设置代码实例
Dec 10 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中字符集转换iconv函数使用总结
2014/10/11 PHP
Yii配置文件用法详解
2014/12/04 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
担保书格式及范文
2014/04/01 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
投资意向协议书
2015/01/29 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
2016情人节宣传语
2015/07/14 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
详解Python常用的魔法方法
2021/06/03 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫