如果我这样做serialize($obj)
,我会得到:
不允许序列化“闭包”
序列化时有什么办法可以忽略这些闭包?当我反序列化字符串时,我不需要它们(这些属性的值可以是 null 或其他)。
我的课看起来像这样:
Class Node{
protected $attrs = array();
}
$attrs
是一个关联数组,可以包含一些闭包元素,例如
$attrs['validator'] = function(){...}
如果我这样做serialize($obj)
,我会得到:
不允许序列化“闭包”
序列化时有什么办法可以忽略这些闭包?当我反序列化字符串时,我不需要它们(这些属性的值可以是 null 或其他)。
我的课看起来像这样:
Class Node{
protected $attrs = array();
}
$attrs
是一个关联数组,可以包含一些闭包元素,例如
$attrs['validator'] = function(){...}
很简单:你不能。闭包是不可序列化的。如果你想创建“类似的东西”,你可以使用实现类的对象__invoke()
而不是闭包。
如果您不需要闭包(或者您可以在反序列化时自己重新创建它们),您可以实现Serializable
并且在序列化时不要考虑闭包。这个接口(实现serialize()
and unserialize()
)应该优先于__sleep()
/ __wakeup()
。
我编写了一个允许任何Exception
序列化的函数。这是通过展平回溯中的复杂值来完成的。
https://gist.github.com/Thinkscape/805ba8b91cdce6bcaf7c
<?php
try {
// exception gets thrown here, i.e.
// throw new Exception();
} catch (Exception $exception) {
flattenExceptionBacktrace($exception);
$serialized = serialize($exception);
$unserialized = unserialize($serialized);
print_r($unserialized->getTraceAsString());
}
在忽略闭包的同时序列化对象的属性:
$properties = array_map(function ($property) {
try {
return serialize($property);
} catch (\Exception $e) {
return null;
}
}, get_object_vars($this));