如果我做serialize($obj)
我得到:
“封闭”的序列化是不允许的
有什么办法这些盖子可序列化时忽略? 我不需要他们的时候我反正反序列化的字符串(这些属性的值可以为空或其他)。
我的类看起来水木清华这样的:
Class Node{
protected $attrs = array();
}
$attrs
是一个关联数组可以包含一些元素是封闭件,如$attrs['validator'] = function(){...}
如果我做serialize($obj)
我得到:
“封闭”的序列化是不允许的
有什么办法这些盖子可序列化时忽略? 我不需要他们的时候我反正反序列化的字符串(这些属性的值可以为空或其他)。
我的类看起来水木清华这样的:
Class Node{
protected $attrs = array();
}
$attrs
是一个关联数组可以包含一些元素是封闭件,如$attrs['validator'] = function(){...}
我写了一个功能,它允许任何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());
}
道理很简单:你不能。 闭包是不是可序列化。 如果你想创建“类似的东西”,你可以使用一个类实现的对象__invoke()
而不是关闭。
如果您不需要关闭(或者你可以自己创建它们,而反序列化)就可以实现Serializable
和序列化时不采取封考虑。 该接口(实现serialize()
和unserialize()
应在中将优先__sleep()
/ __wakeup()
提供自己实现_ 睡眠()和_wakeup方法
序列化而忽略封闭的对象的属性:
$properties = array_map(function ($property) {
try {
return serialize($property);
} catch (\Exception $e) {
return null;
}
}, get_object_vars($this));