如果我serialize($obj)
,我得到:
不允许序列化'关闭'
序列化时是否有任何方法可以忽略这些闭包?我无论如何反序列化字符串时都不需要它们(这些属性的值可以为null或其他)。
我的班级看起来像这样:
Class Node{
protected $attrs = array();
}
$attrs
是一个关联数组,可以包含一些闭包元素,比如
$attrs['validator'] = function(){...}
答案 0 :(得分:7)
这很简单:你做不到。闭包不可序列化。如果要创建“类似的东西”,可以使用实现__invoke()
的类的对象而不是闭包。
如果您不需要闭包(或者您可以在反序列化时自行重新创建),则可以实现Serializable
并且在序列化时不要考虑闭包。此接口(实施serialize()
和unserialize()
)应优先于__sleep()
/ __wakeup()
。
答案 1 :(得分:3)
我编写了一个允许任何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());
}
答案 2 :(得分:2)
答案 3 :(得分:0)
要在忽略闭包的同时序列化对象的属性:
$properties = array_map(function ($property) {
try {
return serialize($property);
} catch (\Exception $e) {
return null;
}
}, get_object_vars($this));