PHP序列化与反序列化方法?反序列化返回bool(false)问题排查
你的反序列化失败原因及修复方案
首先看你给出的序列化字符串,问题出在currency_symbol这一项:
s:15:"currency_symbol";s:12:"kn";
PHP序列化格式里,s:N:"value"中的N是字符串的字节长度,但"kn"实际只有2个字节,你这里写了12,长度不匹配,导致unserialize()无法解析,返回false。
把这部分修正为s:2:"kn";,修正后的完整序列化字符串如下:
$seri = 'a:8:{s:4:"city";s:6:"Novska";s:6:"region";s:27:"Sisacko-Moslavacka Zupanija";s:7:"country";s:2:"HR";s:12:"country_name";s:7:"Croatia";s:14:"continent_code";s:2:"EU";s:10:"ip_address";s:10:"5.43.160.0";s:13:"currency_code";s:3:"HRK";s:15:"currency_symbol";s:2:"kn";}';
再执行unserialize()就能得到正常的数组了,你可以用var_dump($unseri)验证,会输出包含所有位置信息的关联数组。
PHP序列化与反序列化完整指南
基本概念
序列化是将PHP中的变量(数组、对象等)转换成可存储或传输的字符串格式;反序列化则是将这个字符串还原回原变量,常用于数据持久化(比如存在数据库、文件)或跨进程传递数据。
核心函数
序列化:
serialize()
接受任意可序列化的变量(资源类型除外),返回序列化后的字符串:$userLocation = [ 'city' => 'Novska', 'country' => 'HR' ]; $serialized = serialize($userLocation); // 输出:a:2:{s:4:"city";s:6:"Novska";s:7:"country";s:2:"HR";}反序列化:
unserialize()
将序列化字符串还原为原变量,失败时返回false。如果反序列化对象,需要确保对应的类已定义,否则会得到__PHP_Incomplete_Class对象:$unserialized = unserialize($serialized); var_dump($unserialized); // 还原为原数组
关键注意事项
- 字符串长度严格匹配:这是你这次踩坑的点!序列化字符串中的长度是字节数,不是字符数。比如中文UTF-8字符占3字节,计算时要注意,手动修改序列化字符串很容易出错,建议尽量避免手动编辑,而是通过
serialize()生成。 - 可序列化类型:支持标量(int、string、float、bool)、数组、对象;资源类型(比如数据库连接句柄)无法序列化。
- 安全风险:绝对不要反序列化来自不可信来源的数据!恶意构造的序列化字符串可能触发代码执行漏洞。如果必须处理对象,可通过
allowed_classes选项限制允许的类:
或者设置$unserialized = unserialize($data, ['allowed_classes' => ['UserLocation']]);allowed_classes => false,将对象还原为数组。
内容的提问来源于stack exchange,提问作者Chinmay235
相关产品推荐
相关产品推荐

