深度克隆对象和Log4perl

时间:2011-03-24 01:11:24

标签: perl clone log4perl storable

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

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!)并创建没有附加到对象的记录器?

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

1 个答案:

答案 0 :(得分:0)

您可以使用Storable's hooks控制序列化和反序列化。我自己没有使用过钩子,但他们应该这样做。

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

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