总结对比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 相关文章推荐
mysql下创建字段并设置主键的php代码
May 16 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php发送短信验证码完成注册功能
Nov 24 PHP
程序员的表白神器“520”大声喊出来
May 20 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
PHP基于XMLWriter操作xml的方法分析
Jul 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
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
浅析vue中常见循环遍历指令的使用 v-for
2018/04/18 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
python实现bucket排序算法实例分析
2015/05/04 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python爬虫可以爬什么
2020/06/16 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
中专毕业个人的自荐信格式
2013/09/21 职场文书
合同专员岗位职责
2013/12/18 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
遗产继承公证书
2014/04/09 职场文书
2014教师研修学习体会
2014/07/08 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android