阅读更多

2顶
2踩

编程语言

翻译新闻 PHP 序列化变量的 4 种方法

2012-07-31 16:13 by 见习记者 车丽 评论(4) 有13113人浏览
序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。

1.  serialize和unserialize函数

这两个是序列化和反序列化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);

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_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))); 
} 

2.  json_encode 和 json_decode

使用JSON格式序列化和反序列化是一个不错的选择:

  • 使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。
  • JSON格式是可读的。
  • JSON格式比serialize返回数据结果小。
  • 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输出长度显然要短。

3.  var_export 和 eval

var_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。   
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');

//序列化数组
$s = var_export($a , true);
echo $s;
//输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', )

echo '<br /><br />';

//反序列化
eval('$my_var=' . $s . ';');

print_r($my_var);

4.  wddx_serialize_value 和 wddx deserialize

wddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');

//序列化数组
$s = wddx_serialize_value($a);
echo $s;

//输出结果(查看输出字符串的源码):<wddxPacket version='1.0'><header/><data><struct><var name='a'><string>Apple</string></var><var name='b'><string>banana</string></var><var name='c'><string>Coconut</string></var></struct></data></wddxPacket>

echo '<br /><br />';

//反序列化
$o = wddx_deserialize($s);

print_r($o);
//输出结果:Array ( [a] => Apple [b] => banana 1 => Coconut )

可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。

结论

上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。

英文原文:3 ways to serialize variables in php
2
2
评论 共 4 条 请登录后发表评论
4 楼 fyland 2012-08-02 16:53
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode
============================================================================
新手写的?
序列化之前用addslashes转义一下就好了
3 楼 white_crucifix 2012-08-02 15:04
Tangoboy 写道
实测 json 比 serialize 慢!

+1
2 楼 Tangoboy 2012-08-01 13:56
实测 json 比 serialize 慢!
1 楼 yeaha 2012-08-01 09:47
serialize()和unserialize()会自动调用对象的魔法方法__sleep()和__wakeup(),对于某些有外部依赖的对象会比较有用

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • PHP序列化的四种实现方法与横向对比

    一、PHP 序列化变量的 4 种方法 序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性...

  • 用Asp实现QQ在线查询功能

        这段程序的方法是利用XMLHTTP来读取腾讯网站的相应HTML代码获取QQ的头像,根据这个想法,我们还可以抓取很多其他网站的信息,如天气预报、新闻等等。  提示:请把“<>”转换为“<script language="JavaScript">  <!--  function getFaceImg(QQcode)  {  var Re=new RegExp("^[1-9]{1}d+$","g

  • 详解PHP序列化反序列化的方法

    经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值,其实就是一个序列化的过程,在需要用到这些数据库的时候会进行一个反序列化过程,就是将这个字符串再还原成他原来的数据结构。下面说说php 如何...

  • 解析PHP多种序列化与反序列化的方法

    序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。1. serialize和unserialize...

  • PHP多种序列化/反序列化的方法详解

    摘要:序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性.. 序列化是将变量转换...

  • PHP序列化操作方法分析

    本文实例讲述了PHP序列化操作方法。分享给大家供大家参考,具体如下: 序列化就是将变量数据转换为字符串(跟类型转换机制不同),一般应用于存储数据(文件),然后在别的情形下恢复(反序列化) 序列化: $val = ...

  • php php 序列化方法,PHP序列化的4种方法已公布,这是你PHP进阶之路必会的

    【摘要】php作为一种编程软件,也能实现很多功能,不过今天环球网校的小编要为大家讲解PHP序列化的4种方法已公布,这是你PHP进阶之路必会的?看完这个代码你就明白了,因为只要你了解了PHP序列化的4种方法已公布,这...

  • php中序列化与反序列化详解

    serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly'); $new = serialize($stooges); print_r($new);echo ; print_r(unserialize($new)); ...

  • 序列化一个类_php的类的序列化脚本_

    可以对类名和变量根据需要自定义设置,方便了序列化的json对象修改

  • PHP 序列化和反序列化函数实例详解

    序列化与反序列化 把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量  1.创建一个$arr数组用于储存用户基本信息,并在浏览器中输出查看结果; $arr=...

  • 详解php反序列化

    在程序执行结束时,内存数据便会立即销毁,变量所储存的数据便是内存数据,而文件、数据库是“持久数据”,因此PHP序列化就是将内存的变量数据“保存”到文件中的持久数据的过程。 $s = serialize($变量); //该...

  • PHP——serialize()序列化类变量public、protected、private的区别

    文章目录serialize()对于类变量public、protected、private序列化的区别完 serialize() serialize($value)用于序列化,支持除了resource的任何类型,它将传参转化成字节流,便于存储,返回字符串,并且可以迭代嵌套 ...

  • 在线php序列化解析,PHP 序列化/反序列化的方法函数

    序列化(串行化):将变量转换为可保存或传输的字符串的过程,数组就能够存储到mysql数据库;反序列化(反串行化):把字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。...

  • PHP常见的序列化与反序列化操作实例分析

    本文实例讲述了PHP常见的序列化与反序列化操作。分享给大家供大家参考,具体如下: 1.概念 serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量  2.序列化例子 输入输出 $arr=array(); $arr...

  • PHP反序列化魔术方法

    php反序列化漏洞魔术方法

  • php反序列化基础知识之魔术方法

    php魔术方法

  • php-serializer:以任何格式序列化PHP变量,包括对象。 也支持反序列化

    PHP序列化器安装使用安装软件包: $ composer require nilportugues/serializer介绍什么是序列化? 在数据存储的上下文中,序列化是将数据结构或对象状态转换为可以存储(例如,在文件或内存缓冲区中或通过网络连接...

  • PHP反序列化

    一般的序列化攻击都在PHP魔术方法中出现可利用的漏洞,因为自动调用触发漏洞,但如果关键代码没在魔术方法中,而是在一个类的普通方法中。这时候就可以通过构造POP链寻找相同的函数名将类的属性和敏感函数的属性联系...

  • 详解PHP中的序列化、反序列化操作

    本篇文章主要介绍了PHP中的序列化、反序列化操作,可以将一个变量的数据"转换为"字符串,目的是将该字符串存储在本地。相反的行为成为反序列化。

  • PHP序列化的概念

    PHP反序列化漏洞之PHP序列化概念

Global site tag (gtag.js) - Google Analytics