2011-03-24 3 views
0

Storable의 dclone()을 사용하여 Log4perl 로거가 첨부 된 여러 가지 복잡한 개체의 복사본을 만듭니다. Storable은 CODE refs를 포함하고 있기 때문에 로거 객체를 만났을 때 불평합니다. 내가 코드 심판을 직렬화 할 옵션을 설정하면, 나는 불길한 복제 과정에서 경고개체 및 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)이 작업에 (더) 적합한 펄 모듈이 있습니까? 이상적으로는 로거가 아닌 객체 나 데이터 부분 만 복사되도록 재귀 복사를 제어하고 싶습니다.

2) ... 내 객체의 자체 로깅 기능을 꺼내고 객체에 연결되지 않은 로거를 만드는 것이 더 낫겠습니까?

모든 조언이나 통찰력을 주시면 감사하겠습니다.

답변

0

Storable's hooks을 사용하여 직렬화 및 직렬화를 제어 할 수 있습니다. 나는 나 자신을 사용하지 않았지만 트릭을해야합니다.

개체의 데이터를 간단한 해시 (로깅 비트 제외)로 복사하고 해당 해시에서 Storable::freeze을 호출하여 직렬화 된 양식으로 반환 할 수 있습니다. 그런 다음 해동 고리에서 그 과정을 역전시키고 로깅 작업을 마무리하십시오. 약간의 실험을 통해 더 좋은 솔루션을 얻을 수도 있지만이 방법은 "객체의 해시 된 버전을 고정"하는 방식이 효과적 일 것이며 시작 지점을 제공 할 것입니다.

또한 후크에서 복제를 감지하고 로깅을 수행하는 데 필요한 모든 작업을 수행 할 수 있습니다.

+0

문제의 일부는 어제 가능한 솔루션을 실험 할 때 Storable의 후크가 작동하지 않는다는 것입니다. 로거 객체를 확인하고 존재하는 경우 삭제하는 후크를 구현했습니다 ... 조금 더러운 해커 솔루션처럼 보이지만 어쩌면 그걸 참을 수 있습니다. : S –

+0

"불쾌한"것이 적용되는지 모르지만 해킹 비트입니다. OTOH, 후크는 이유 때문에 거기에 있습니다. 그래서 그것은 해킹이지만 kludge는 아닙니다. –

+0

kludge보다 나은 해킹이 가능합니다. ; ^) –