2011-03-24 66 views
0

我正在使用Storable的dclone()来创建各种复杂对象的副本,这些对象是使用附加的Log4perl记录器进行自我记录的。当它遇到记录器对象时存储抱怨,因为它包含CODE参考。当我打开相应的选项序列化代码裁判,我得到在克隆过程中的不祥警告深入克隆对象和Log4perl

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)...还是我最好从我的对象中取出对象的自我记录能力(sob!),并创建没有附加到对象的记录器?

任何意见或见解,将不胜感激。

回答

0

您可以使用Storable's hooks控制序列化和反序列化。我自己并没有使用钩子,但他们应该这样做。您可以将对象的数据复制到一个简单的散列(不带日志记录位),在该散列上调用Storable::freeze,然后将其作为序列化的形式返回;然后,在解冻钩中,您只需将该过程逆转并将您的日志记录连接起来。一些实验可能会产生一个更漂亮的解决方案,但这个“冻结对象的散列版本”方法应该可以工作,它会给你一个起点。

您还可以在钩子中检测克隆,并完成日志记录所需的任何操作。

+0

问题的一部分是我昨天在试验可能的解决方案时无法获得Storable的挂钩。我现在已经实现了钩子来检查记录器对象并删除它们(如果它们存在的话)......它看起来像是一个讨厌的hacky解决方案,但也许我会忍受它。 :S – 2011-03-24 18:50:31

+0

我不知道是否适用“讨厌”,但它有点破解。 OTOH,钩子是有原因的,所以它是一个黑客,但不是一个杂凑。 – 2011-03-24 19:27:42

+0

我猜,比一个烂泥好一点! ; ^) – 2011-03-25 04:07:34