序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。兄弟连PHP培训(www.lampbrother.net)
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);
//输出结果 Array ( [a] => Apple [b] => banana [c] => Coconut )
?>
当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用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将有不同的效果。
分享到:
相关推荐
通过构建类似实际网络的拓扑结构、部署各种安全设备和应用,靶场可以模拟出多样化的网络攻防场景。这使得安全人员能够在安全的环境中进行实际操作,全面提升其实战能力。 其次,靶场是渗透测试和漏洞攻防演练的理想...
PHP允许在序列化和反序列化时使用类的魔术方法来增加额外的功能。 - `__sleep()` 方法:在对象被序列化前调用,可以用于执行清理操作,关闭数据库连接等。在序列化过程中,只序列化`__sleep()`方法返回的属性列表。...
需要注意的是,当对象的实例进行序列化时,PHP不会自动调用对象的__sleep()方法,进行反序列化时,也不会自动调用__wakeup()和__construct()方法。 让我们通过一个具体的例子来分析PHP自定义序列化接口Serializable...
3. 序列化和反序列化:protobuf库提供了方法,可以将数据对象转化为二进制流进行存储或传输,反之也能从二进制流恢复数据对象。 在PHP中使用protobuf,开发者首先需要安装protobuf扩展,然后定义数据结构的.proto...
当使用`serialize()`和`unserialize()`时,攻击者可能通过构造恶意序列化数据来触发特定的魔术方法,如`__wakeup()`, `__sleep()`, `__destruct()`, 等。应避免在不受控的情况下使用`unserialize`,并确保对象实例...
相比默认的PHP序列化(serialize)和反序列化(unserialize)方法,igbinary能够显著提升性能,特别是在大型数据结构或者频繁序列化操作的应用场景中。 描述中提到的“部署文档:...
- **自定义序列化/反序列化**:使用`setOption()`设置序列化方法,控制数据的存储格式。 4. **最佳实践** - **缓存策略**:根据业务需求选择合适的缓存策略,如:全量缓存、增量缓存、LRU(Least Recently Used)...
在Laravel框架中,Serializer是处理数据序列化和反序列化的关键组件,它允许开发者将复杂的PHP对象转换为JSON或其他格式,以便于网络传输或存储。在这个“Laravel开发-laravel-serializer .zip”文件中,很可能是...
虽然Memcached的数据存储在内存中,但可以通过序列化和反序列化数据来实现一定程度的持久化。 五、性能优化 1. 并行操作: 利用PHP的多线程或异步特性,可以同时执行多个Memcached操作,提高效率。 2. 适当分片:...
使用`serialize()`方法进行序列化,`unserialize()`进行反序列化。 **9. 异常处理** PHP使用`try-catch`语句块处理运行时错误,通过`throw`抛出异常,`catch`捕获并处理异常。 **总结** PHP的面向对象编程提供了...
在PHP中,我们可以使用序列化和反序列化来实现备忘录模式。 最后,适配器模式是将两个不兼容的接口进行桥接,使得原本无法一起工作的类能够协同工作。在PHP中,我们可以通过继承或组合来实现适配器,使得旧代码可以...
igbinary扩展能够优化PHP对象在内存中的序列化和反序列化过程,相比默认的序列化方式(如`serialize`和`unserialize`),igbinary可以显著减少内存占用和提高处理速度。这对于大规模的数据交换或内存数据库如Redis来...
在Ajax中,JSON常用于数据的序列化和反序列化。由于JSON格式与JavaScript对象语法高度相似,因此在JavaScript中处理JSON数据非常方便。 **PHP与Ajax结合** PHP作为服务器端脚本语言,可以生成JSON数据供Ajax调用。...
- 序列化:自动处理非字符串类型数据的序列化和反序列化。 - 键空间通知:通过监听键空间事件,实现数据变更的实时响应。 五、最佳实践 1. 使用合理的键名:键名应具有描述性且尽可能短,避免内存浪费。 2. 预估...
课时2:PHP反序列化识别与利用14'22 课时3:PHP序列化特殊点介绍15'28 课时4:魔术方法20'35 课时5:序列化漏洞案例 - 任意命令执行05'53 课时6:Phar反序列化10'38 第7章 第7章 Python基础 课时1:7.1-...
1.该waf 1000多行,可防御一句话木马 注入 反序列化 命令执行,非65行只过滤的waf可比。 2.编译waf.c生成.so文件 waf.so (已编译) 3.将waf.so,watchbird.php文件存放在/var/www/html或其他目录中(/tmp) 4 每个...
- **TJSONProtocol**:使用 JSON 格式进行序列化和反序列化。 ##### 2.4 版本控制 (Versioning) Thrift 支持服务版本控制,可以在不破坏现有客户端的情况下升级服务。这意味着你可以更改服务接口,增加新的方法...
5. 输入/输出流:文件操作,网络通信,序列化和反序列化。 6. 多线程:线程的创建、同步、通信和生命周期管理。 7. Java EE:Servlet、JSP、EJB等企业级开发技术,以及MVC设计模式的应用。 该手册作为学习工具,...
- **TProtocol**:定义了Thrift数据的序列化和反序列化方式。 - **TTransport**:负责数据的实际传输。 - **底层I/O通信**:提供了各种网络传输方式,如TCP、UDP等。 **3. 数据类型** Thrift支持以下几种数据类型...
学习PHP与XML的结合应用对于Web开发人员来说是必要的,因为这不仅可以帮助处理服务器和客户端的数据交换,还可以与各种API和服务进行交互,实现数据的序列化和反序列化。通过深入理解这些XML处理工具,你将能够更好...