3

如果我这样做serialize($obj),我会得到:

不允许序列化“闭包”

序列化时有什么办法可以忽略这些闭包?当我反序列化字符串时,我不需要它们(这些属性的值可以是 null 或其他)。

我的课看起来像这样:

Class Node{

  protected $attrs = array();

}

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

4

4 回答 4

9

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

如果您不需要闭包(或者您可以在反序列化时自己重新创建它们),您可以实现Serializable并且在序列化时不要考虑闭包。这个接口(实现serialize()and unserialize())应该优先于__sleep()/ __wakeup()

于 2013-01-09T13:05:37.897 回答
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());
}
于 2015-03-06T17:25:56.493 回答
2

提供您自己的_ sleep()实现和_唤醒方法

于 2013-01-09T13:01:08.700 回答
1

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

$properties = array_map(function ($property) {
    try {
        return serialize($property);
    } catch (\Exception $e) {
        return null;
    }
}, get_object_vars($this));
于 2018-10-04T08:19:37.743 回答