【发布时间】:2018-04-13 09:35:43
【问题描述】:
根据the docs
当现在实现此接口的类的旧实例(在该类实现接口之前已被序列化)被反序列化时,将调用 __wakeup() 而不是 unserialize 方法,这可能对迁移有用。
我认为这非常聪明和有用,并想检查一下。不幸的是,它对我不起作用,我想知道是我做错了什么还是有错误。
测试代码:
//class Foo
class Foo implements \Serializable
{
public $a = 'lorem';
public function __wakeup()
{
fprintf(STDOUT, "in %s\n", __METHOD__);
}
public function serialize()
{
fprintf(STDOUT, "in %s\n", __METHOD__);
return serialize([
$this->a,
]);
}
public function unserialize($serialized)
{
fprintf(STDOUT, "in %s\n", __METHOD__);
list(
$this->a,
) = unserialize($serialized);
}
}
//$foo = new Foo();
//var_dump(serialize($foo));
//exit;
$serialised = 'O:3:"Foo":1:{s:1:"a";s:5:"lorem";}';
//$serialised = 'C:3:"Foo":22:{a:1:{i:0;s:5:"lorem";}}';
$foo = unserialize($serialised);
var_dump($foo);
它崩溃了:
Warning: Erroneous data format for unserializing 'Foo' in /in/SHaCP on line 39
Notice: unserialize(): Error at offset 13 of 34 bytes in /in/SHaCP on line 39
bool(false)
本质上,我序列化了$foo 对象,没有和使用\Serializable 接口。然后添加接口,尝试unserialize()之前形式序列化的对象(注意,以O开头的序列化字符串是没有接口的,而以C开头的是带接口的)。
我在这里做错了吗?还是我误解了文档?
【问题讨论】:
标签: php serialization