2011-03-24 71 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