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
理解PHP5中static和const关键字的区别
Mar 19 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
深入掌握include_once与require_once的区别
Jun 17 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
PHP实现的简易版图片相似度比较
Jan 07 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
PHP中数组转换为SimpleXML教程
Jan 27 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
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
PHP数组操作类实例
2015/07/11 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Sanic框架路由用法实例分析
2018/07/16 Python
查看python下OpenCV版本的方法
2018/08/03 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
wxPython实现列表增删改查功能
2019/11/19 Python
Python高级property属性用法实例分析
2019/11/19 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
护理自荐信
2013/10/22 职场文书
家长对老师的评语
2014/04/18 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
田径运动会通讯稿
2014/09/13 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
新郎新娘答谢词
2015/01/04 职场文书
Python超详细分步解析随机漫步
2022/03/17 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技