总结对比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 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
php 在文件指定行插入数据的代码
May 08 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
PHP函数积累总结
Mar 19 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
Yii框架模拟组件调用注入示例
Nov 11 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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
967 个函式
2006/10/09 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
Python struct.unpack
2008/09/06 Python
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Django如何自定义分页
2018/09/25 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
python正则表达式实例代码
2020/03/03 Python
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
暑期培训班策划方案
2014/08/26 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
二审代理词范文
2015/05/25 职场文书