如何序列化具有属性内部闭包的对象?

时间:2013-01-09 12:59:06

标签: php string serialization closures

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

  

不允许序列化'关闭'

序列化时是否有任何方法可以忽略这些闭包?我无论如何反序列化字符串时都不需要它们(这些属性的值可以为null或其他)。

我的班级看起来像这样:

Class Node{

  protected $attrs = array();

}

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

4 个答案:

答案 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)

提供您自己的_sleep() _wakeup方法的实现

答案 3 :(得分:0)

要在忽略闭包的同时序列化对象的属性:

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