php中序列化与反序列化

把复杂的数据类型压缩到一个字符串中

serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
eg:
$stooges = array('Moe','Larry','Curly');
$new = serialize($stooges);
print_r($new);echo "<br />";
print_r(unserialize($new));
结果: a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}
Array ( [0] => Moe [1] => Larry [2] => Curly )
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);
echo '<a href="next.php?cart='.urlencode(serialize($shopping)).'">next</a>';
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启
$new_cart = unserialize($cart);
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
复制代码
$fp = fopen('/tmp/cart','w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//如果magic_quotes_runtime开启
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart')));
//如果magic_quotes_runtime关闭
$new_cat = unserialize(file_get_contents('/tmp/cart'));
在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。
mysql_query("insert into cart(id,data) values(1,'".addslashes(serialize($cart))."')");
$rs = mysql_query('select data from cart where id=1');
$ob = mysql_fetch_object($rs);
//如果magic_quotes_runtime开启
$new_cart = unserialize(stripslashes($ob->data));
//如果magic_quotes_runtime关闭
$new_cart = unserialize($ob->data);
复制代码
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。
### PHP序列化反序列化的概念 在PHP中,序列化指的是将对象转换成字符串表示形式的过程。这种字符串包含了足够的信息来重建该对象。而反序列化则是相反的操作——即从字符串恢复原对象。 ```php $originalObject = new stdClass(); $serializedString = serialize($originalObject); ``` 此过程使得可以在文件系统、数据库或者其他任何形式的数据存储介质上保存这些对象的状态[^1]。 ### 使用方法 为了实现对象的序列化,在PHP里可以直接调用内置函数`serialize()`;对于反序列化,则应使用`unserialize()`函数: #### 序列化操作 ```php <?php class User { public $name; } $user = new User(); $user->name = "John Doe"; // 将User对象序列化为字符串 $serializedData = serialize($user); echo $serializedData; // 输出类似于:O:4:"User":1:{s:4:"name";s:8:"John Doe";} ?> ``` #### 反序列化操作 当需要重新获取之前被序列化的对象时,可以通过下面的方式来进行反序列化: ```php <?php $restoredUser = unserialize($serializedData); var_dump($restoredUser); // 显示已还原的对象属性 ?> ``` 上述例子展示了如何简单地完成一次完整的序列化反序列化进程。 ### 注意事项 - **一致性**: 当执行反序列化的时候,确保当前环境中存在相同的类定义是非常重要的。如果尝试在一个没有相应类定义的地方加载序列化后的数据,将会抛出错误。 - **安全性考虑**: 不要轻易信任来自外部不可控源头传来的序列化字符串。恶意构造的数据可能导致严重的安全漏洞,比如远程代码执行(RCE)。 ### 安全性建议 为了避免潜在的风险,应当采取以下措施保障应用程序的安全: - 对输入做严格的验证; - 避免直接对外部提交的内容进行反序列化; - 如果可能的话,采用更安全的方法代替传统的序列化机制,例如JSON编码/解码等替代方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值