总结对比php中的多种序列化


Posted in PHP onAugust 28, 2016

前言

序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能 够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也 与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。 如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

serialize和unserialize函数

这两个是序列化和反序列化PHP中数据的常用函数。有利于存储或传递 PHP 的值,同时不丢失其类型和结构。

<?php

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');

//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}

echo '<br /><br />';

//反序列化
$o = unserialize($s);

print_r($o);
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut )

?>

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encodebase64_decode

$obj = array();
//序列化
$s = base64_encode(serialize($obj));
//反序列化
$original = unserialize(base64_decode($s));

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。

//定义一个用来序列化对象的函数

function my_serialize( $obj )
{
 return base64_encode(gzcompress(serialize($obj)));
}

//反序列化
function my_unserialize($txt)
{
 return unserialize(gzuncompress(base64_decode($txt)));
}

json_encode 和 json_decode

使用JSON格式序列化和反序列化是一个不错的选择:

使用json_encodejson_decode格式输出要serializeunserialize格式快得多。

     (1) JSON格式是可读的。

     (2) JSON格式比serialize返回数据结果小。

     (3) JSON格式是开放的、可移植的。其他语言也可以使用它。

$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');
 
//序列化数组
$s = json_encode($a);
echo $s;
//输出结果:{"a":"Apple","b":"banana","c":"Coconut"}
 
echo '<br /><br />';
 
//反序列化
$o = json_decode($s);

在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。需要注意的是json_encode不能序列化对象。

总结

以上就是这篇文章的全部内容,希望大家能够喜欢并且给大家带来帮助。如果有问题可以留言讨论。

PHP 相关文章推荐
使用 PHPMAILER 发送邮件实例应用
Nov 07 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
destoon复制新模块的方法
Jun 21 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
PHP设置进度条的方法
Jul 08 PHP
PHP-FPM之Chroot执行环境详解
Aug 03 PHP
YII使用url组件美化管理的方法
Dec 28 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
PHP静态成员变量
Feb 14 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 PHP
PHP7 foreach() 函数修改
Mar 09 PHP
PHP打印输出函数汇总
Aug 28 #PHP
PHP中include/require/include_once/require_once使用心得
Aug 28 #PHP
PHP常用的三种设计模式汇总
Aug 28 #PHP
Apache PHP MySql安装配置图文教程
Aug 27 #PHP
php微信开发接入
Aug 27 #PHP
php微信开发自定义菜单
Aug 27 #PHP
PHP7新特性foreach 修改示例介绍
Aug 26 #PHP
You might like
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
PHP查询分页的实现代码
2017/06/09 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
Js中sort()方法的用法
2006/11/04 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
Python中__name__的使用实例
2015/04/14 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
python如何在循环引用中管理内存
2018/03/20 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
判断单链表中是否存在环
2012/07/16 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
重阳节主题班会
2015/08/17 职场文书
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL