总结对比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 相关文章推荐
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
基于php验证码函数的使用示例
May 03 PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
php+jQuery递归调用POST循环请求示例
Oct 14 PHP
PHP实现表单提交时去除斜杠的方法
Dec 26 PHP
PHP基于SMTP协议实现邮件发送实例代码
Apr 27 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
May 20 PHP
PHP实现权限管理功能示例
Sep 22 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
如何通过PHP实现Des加密算法代码实例
May 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
图象函数中的中文显示
2006/10/09 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
vue cli安装使用less的教程详解
2019/07/12 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
python快速排序代码实例
2013/11/21 Python
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
yy结婚证婚词
2014/01/10 职场文书
幼儿园开学寄语
2014/04/03 职场文书
公司请假条格式
2014/04/11 职场文书
师德演讲稿范文
2014/05/06 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis