总结对比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 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
php操作xml入门之cdata区段
Jan 23 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
php实现遍历文件夹的方法汇总
Mar 02 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 PHP
php访问对象中的成员的实例方法
Nov 17 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
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
PHP Session机制简介及用法
2014/08/19 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
js模拟微博发布消息
2017/02/23 Javascript
js图片上传的封装代码
2017/08/01 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
python多线程用法实例详解
2015/01/15 Python
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python调用命令行进度条的方法
2015/05/05 Python
Python中的ctime()方法使用教程
2015/05/22 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
python七夕浪漫表白源码
2019/04/05 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
2014年计生标语
2014/06/23 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
《学会看病》教学反思
2016/02/17 职场文书
入团申请书格式
2019/06/20 职场文书
部分武汉产收音机展览
2022/04/07 无线电