如何序列具有内部性关闭对象?(How to serialize object that has cl

2019-07-18 01:26发布

如果我做serialize($obj)我得到:

“封闭”的序列化是不允许的

有什么办法这些盖子可序列化时忽略? 我不需要他们的时候我反正反序列化的字符串(这些属性的值可以为空或其他)。

我的类看起来水木清华这样的:

Class Node{

  protected $attrs = array();

}

$attrs是一个关联数组可以包含一些元素是封闭件,如$attrs['validator'] = function(){...}

Answer 1:

我写了一个功能,它允许任何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());
}


Answer 2:

道理很简单:你不能。 闭包是不是可序列化。 如果你想创建“类似的东西”,你可以使用一个类实现的对象__invoke()而不是关闭。

如果您不需要关闭(或者你可以自己创建它们,而反序列化)就可以实现Serializable和序列化时不采取封考虑。 该接口(实现serialize()unserialize()应在中将优先__sleep() / __wakeup()



Answer 3:

提供自己实现_ 睡眠()和_wakeup方法



Answer 4:

序列化而忽略封闭的对象的属性:

$properties = array_map(function ($property) {
    try {
        return serialize($property);
    } catch (\Exception $e) {
        return null;
    }
}, get_object_vars($this));


文章来源: How to serialize object that has closures inside properties?