我正在使用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!)并创建没有附加到对象的记录器?
任何建议或见解都将不胜感激。
答案 0 :(得分:0)
您可以使用Storable's hooks控制序列化和反序列化。我自己没有使用过钩子,但他们应该这样做。
您可以将对象的数据复制到一个简单的哈希(没有日志记录位),在该哈希上调用Storable::freeze
,并将其作为序列化表单返回;然后,在解冻钩子中,你只需要反转这个过程并连接你的日志记录。一些实验可能会产生更漂亮的解决方案,但这种“冻结对象的哈希版本”方法应该有效,它会给你一个起点。
您还可以检测钩子中的克隆,并执行日志记录所需的任何操作。