我正在尝试序列化一个php对象然后反序列化它。
当我序列化,然后将获得的字符串放在一个文件中,然后读取文件并反序列化,一切正常。
当我序列化,然后将获取的字符串存储在数据库字段中,然后将其读回并尝试反序列化,这不起作用。 我注意到我从数据库中读取的字符串包含一些特殊字符(例如“e;)。我试图通过使用htmlspecialchars_decode来摆脱它们,但仍然无法使用unserialize(消息:unserialize():偏移时出错)当我试图看到那些角色时,我看不到任何特别的东西。
任何帮助?
答案 0 :(得分:1)
将其存储在BLOB / BINARY列中,而不是TEXT或(VAR)CHAR中。某些属性的序列化例如包含NULL字节。
正如@Barmar所说,documentation states this explicitly:
请注意,这是一个二进制字符串,可能包含空字节,需要像这样存储和处理。例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是存储在CHAR或TEXT字段中。
举例说明:
<?php
class Foo { private $bar = "baz";}
$string = serialize(new Foo());
echo $string.PHP_EOL;
for($i = 0; $i < strlen($string); $i++){
echo $string[$i]."(".dechex(ord($string[$i])).")";
}
视觉输出:
O:3:"Foo":1:{s:8:"Foobar";s:3:"baz";}
但是:眼睛可以看到更多:
O(4f):(3a)3(33):(3a)"(22)F(46)o(6f)o(6f)"(22):(3a)1(31):(3a){..
(7b)s(73):(3a)8(38):(3a)"(22)(0)F(46)o(6f)o(6f)(0)b(62)a(61)r(72)"
^ ----------------^-- there's two of your NULL bytes.