【问题标题】:Deep cloning an object and Log4perl深度克隆对象和 Log4perl
【发布时间】:2011-03-24 01:11:24
【问题描述】:

我正在使用 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) ...或者我最好从我的对象中取出对象的自我记录功能(呜咽!)并创建不附加到对象的记录器?

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

【问题讨论】:

    标签: perl clone log4perl storable


    【解决方案1】:

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

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

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

    【讨论】:

    • 部分问题是我昨天在尝试可能的解决方案时无法让 Storable 的挂钩工作。我现在已经实现了钩子来检查记录器对象并在它们存在时删除它们......这似乎是一个令人讨厌的 hacky 解决方案,但也许我会忍受它。 :S
    • 我不知道“讨厌”是否适用,但它有点 hack。 OTOH,钩子在那里是有原因的,所以它是一个 hack 但不是 kludge。
    • 我猜,hack 总比 kludge 好! ;^)
    • 一个 hack 有点受人尊敬,一个 kludge 是你在礼貌的公司中不会谈论的东西。
    猜你喜欢
    • 2010-09-09
    • 2012-06-05
    • 2013-09-06
    • 2013-10-11
    • 2018-03-21
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多