0

我正在使用 Storabledclone()创建各种复杂对象的副本,这些对象是带有附加 Log4perl 记录器的自我记录。Storable 在遇到 logger 对象时会报错,因为它包含CODErefs。当我打开序列化代码引用的选项时,我收到不祥的警告

Useless use of a constant (???) in void context at (eval 1668) line 16.
Useless use of a constant (???) in void context at (eval 1668) line 10.

在克隆过程中,克隆对象的记录器不再起作用。

我正在克隆的对象由其他对象组成,记录器可能附加到对象、其组件、它们的子组件等。

理想情况下,我希望克隆过程忽略任何记录器对象。

1)是否有任何 Perl 模块(更)适合这项任务?理想情况下,我希望能够控制递归复制,以便只复制不是记录器的对象或数据片段。

2) ...或者我最好从我的对象中取出对象的自我记录功能(呜咽!)并创建不附加到对象的记录器?

任何建议或见解将不胜感激。

4

1 回答 1

0

您可以使用Storable 的 hooks控制序列化和反序列化。我自己没有使用过这些钩子,但它们应该可以解决问题。

您也许可以将对象的数据复制到一个简单的散列(没有记录位),调用Storable::freeze该散列,并将其作为序列化形式返回;然后,在解冻钩子中,您只需反转该过程并连接您的日志记录。一些实验可能会产生一个更漂亮的解决方案,但是这种“冻结对象的哈希化版本”方法应该可以工作,它会给你一个起点。

您还可以检测挂钩中的克隆,并使用日志记录执行任何需要完成的操作。

于 2011-03-24T02:39:37.560 回答