总结对比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 相关文章推荐
打造计数器DIY三步曲(中)
Oct 09 PHP
php笔记之:有规律大文件的读取与写入的分析
Apr 26 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
php可变长参数处理函数详解
Feb 22 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 PHP
PHP常用字符串函数用法实例总结
Jun 04 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
10个简化PHP开发的工具
2014/12/25 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
python输出指定月份日历的方法
2015/04/23 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
使用Python实现正态分布、正态分布采样
2019/11/20 Python
Python中无限循环需要什么条件
2020/05/27 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
原装进口全世界:天猫国际
2016/08/03 全球购物
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
个人向公司借款协议书
2014/10/09 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
《围炉夜话》110句人生箴言,精辟有内涵,引人深思
2019/10/23 职场文书
Go并发4种方法简明讲解
2022/04/06 Golang
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL