Глубокое клонирование объекта и Log4perl

Я использую Storable's dclone() создавать копии различных сложных объектов, которые самостоятельно регистрируются с подключенными регистраторами Log4perl. Storable жалуется, когда встречает объект logger, потому что содержит 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.

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

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

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

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

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

Любой совет или понимание будут оценены.

1 ответ

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

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

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

Другие вопросы по тегам