Глубокое клонирование объекта и Log4perl - PullRequest
0 голосов
/ 24 марта 2011

Я использую Storable's dclone() для создания копий различных сложных объектов, которые самостоятельно регистрируются с подключенными регистраторами Log4perl.Storable жалуется, когда сталкивается с объектом логгера, потому что он содержит CODE ссылок.Когда я включаю опцию сериализации ссылок на код, я получаю зловещее предупреждение

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.

во время процесса клонирования, и регистратор клонированных объектов больше не функционирует.

Объекты, которые я 'm клонирование состоит из других объектов, и регистраторы могут быть присоединены к объекту, его компонентам, их подкомпонентам и т. д.

В идеале я бы хотел, чтобы процесс клонирования игнорировал любые объекты регистратора.

1) Существуют ли какие-либо модули Perl, которые (более) подходят для этой задачи?В идеале я хотел бы иметь возможность контролировать рекурсивное копирование, чтобы копировались только объекты или фрагменты данных, которые не были регистраторами.

2) ... или мне было бы лучше избавиться отрегистрировать возможности объектов (рыдать!) из моих объектов и создавать логгеры, которые не привязаны к объектам?

Буду признателен за любые советы или идеи.

1 Ответ

0 голосов
/ 24 марта 2011

Сериализацией и десериализацией можно управлять с помощью хуков Storable .Я сам не использовал хуки, но они должны сделать свое дело.

Возможно, вы сможете скопировать данные вашего объекта в простой хеш (без битов логирования), вызвать Storable::freeze для этого хеша ивернуть это как сериализованную форму;затем, в оттаивающем крючке, вы просто изменили бы этот процесс и подключили свои записи.Немного экспериментов может привести к более хорошему решению, но этот подход «замораживание хеш-версии объекта» должен работать, и он даст вам отправную точку.

Вы также можете обнаружить клонирование в ловушках ивсе, что нужно сделать с регистрацией.

...