`

PHP 序列化变量的 4 种方法

    博客分类:
  • php
 
阅读更多
PHP 序列化变量的 4 种方法(转)

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

1.  serialize和unserialize函数

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

当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
Php代码
$obj = array(); 
//序列化 
$s = base64_encode(serialize($obj));  
//反序列化 
$original = unserialize(base64_decode($s));  

但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。
Php代码
//定义一个用来序列化对象的函数 
 
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格式是开放的、可移植的。其他语言也可以使用它。
Php代码
$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代码来执行,反序列化得到最初变量的内容。   
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字符串形式输出。
Php代码
$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将有不同的效果。
分享到:
评论

相关推荐

    java序列化对象传给php

    android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...

    PHP 序列化和反序列化

    在`demo`文件中,可能包含了一个关于如何使用PHP序列化和反序列化的示例代码。你可以查看这个文件来进一步了解这两个功能的实际应用。 总结来说,PHP的序列化和反序列化是处理和交换数据的关键工具,但同时也需要...

    PHP序列化(serialize)格式详解

    PHP 序列化是将 PHP 对象或变量转换为字符串的过程,以便于存储或传输。PHP 序列化格式是一种特殊的文本格式,敏感于字母大小写和空白(空格、回车、换行等)。在序列化过程中,PHP 使用不同的字母来标示不同的数据...

    PHP中的序列化和反序列化

    在PHP中,序列化和反序列化是两种重要的数据处理技术,用于将变量转换为可存储或传输的格式,然后再恢复为原始数据结构。这两个函数,`serialize()`和`unserialize()`,是PHP内置的,用于在不同场景下处理数据。 `...

    phprpc.jar 包java 反序列化PHP工程demo

    1. **PHP序列化与反序列化**:PHP提供了一种序列化机制,可以将变量转化为字符串,便于存储或传递。反序列化则是将这个字符串恢复为原始的变量结构。在Java中实现PHP的序列化和反序列化,有助于Java应用与PHP应用...

    php反序列化例题.docx

    接着,我们使用 `unserialize()` 函数对字符串进行反序列化,将其转换回数组形式,保存在 `$unserializedData` 变量中。最后,我们使用 `print_r()` 函数打印出反序列化后的数组。 四、安全注意事项 在进行反序列...

    详解PHP序列化和反序列化原理

    首先,要理解PHP序列化和反序列化的概念。序列化是PHP中将对象或变量的状态信息转换成可以存储或传输的形式的过程,反序列化则是将这些存储或传输后的信息还原成PHP中可以识别的对象或变量的过程。PHP通过serialize...

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

    WDDX的优势在于其XML结构使得数据可读性强,但相比JSON和PHP序列化,它的使用较少,因为其格式较复杂,且处理速度较慢。 总结: - `serialize` 和 `unserialize` 是PHP中基础且常用的序列化和反序列化工具,适用于...

    php 序列化和反序列化学习-1

    在PHP中,序列化和反序列化是两个重要的概念,它们用于将数据对象转换为字符串以便存储或传输,以及将字符串还原为原始的数据结构。在本文中,我们将深入探讨这两个概念,以及它们在PHP中的应用。 首先,让我们了解...

    SuperClosure一个允许闭包序列化的PHP库

    4. **存储或传递序列化后的闭包**:现在,你可以将`$serializedClosure`保存到数据库、文件或通过网络传递。 5. **反序列化闭包**:当需要使用闭包时,使用相同的`Serializer`实例进行反序列化。 ```php $...

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

    总结来说,PHP提供了多种序列化与反序列化的方法,每种都有其特点和适用场景。`serialize`和`unserialize`适合PHP内部使用,`json_encode`和`json_decode`则更适合跨语言的数据交换,而`var_export`和`eval`以及`...

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

    在PHP中,序列化和反序列化是两个重要的概念,它们用于在内存和持久存储(如文件、数据库)之间转换复杂的数据结构。序列化是将数据结构(如数组、对象)转换为字符串的过程,以便存储或传输;而反序列化则是将这个...

    yii2 反序列化写shell方式利用1

    如果攻击者能够将这个序列化后的字符串发送回服务器并使其反序列化,那么`FnStream`对象的销毁将触发`CodeFile`对象的`save`方法,从而将恶意内容写入文件。 #### 安全建议 为了避免此类安全问题的发生,可以采取...

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

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

    bfengj#CTF#thinkphp5.0.24反序列化rce1

    thinkphp5.0.24反序列化rceModel是抽象类protected $append = [];// $value值,作为call函数引用的第二变量p

    php json与xml序列化/反序列化

    在Web开发中,数据交换和存储常常涉及到对象的序列化和反序列化。PHP提供了多种方式来处理这一过程,其中最常用的两种...在实际应用中,理解并熟练掌握这两种序列化和反序列化方法对于提升代码效率和可维护性至关重要。

    cpp-swooleserialize是目前php7中最快的序列化函数

    相较于传统的PHP序列化方法,`swoole_serialize`优化了内存管理和CPU计算,减少了不必要的内存拷贝,以及提高了序列化和反序列化的速度。这得益于其底层C/C++实现,能够更直接地操作内存,避免了PHP解释器的额外开销...

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

    在PHP编程中,序列化和反序列化是两种非常重要的数据处理技术,它们主要用于将复杂的变量结构转换为可存储或传输的格式,然后再恢复为原始形式。本文将深入探讨这两个概念,结合实例来分析PHP中如何使用`serialize()...

Global site tag (gtag.js) - Google Analytics