Новичок Moose, MooseX:: Storage и MooseX::Log4Perl проблема: не удается сохранить объект



Я пишу свою первую базовую программу для лосей. Программа создает объект "состояние", который является композицией нескольких других объектов лося. В конце программы я хочу сохранить объект "состояние" в файл. Я пытаюсь использовать для этого Moosex:: Storage. Я получаю ошибку (ниже), которая подразумевает, что он пытается сериализовать объект MooseX::Log::Log4perl.



Object (Log::Log4perl::Logger=HASH(0x2211c800)) does not have a &pack method, cannot collapse at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Engine.pm line 205
MooseX::Storage::Engine::__ANON__('Log::Log4perl::Logger=HASH(0x2211c800)', 'HASH(0x20c54890)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Engine.pm line 88
MooseX::Storage::Engine::collapse_attribute_value('MooseX::Storage::Engine=HASH(0x2211cac0)', 'Moose::Meta::Attribute=HASH(0x20419510)', 'HASH(0x20c54890)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Engine.pm line 60
MooseX::Storage::Engine::collapse_attribute('MooseX::Storage::Engine=HASH(0x2211cac0)', 'Moose::Meta::Attribute=HASH(0x20419510)', 'HASH(0x20c54890)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Engine.pm line 141
MooseX::Storage::Engine::map_attributes('MooseX::Storage::Engine=HASH(0x2211cac0)', 'collapse_attribute', 'HASH(0x20c54890)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Engine.pm line 37
MooseX::Storage::Engine::collapse_object('MooseX::Storage::Engine=HASH(0x2211cac0)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Basic.pm line 13
MooseX::Storage::Basic::pack('ScanCtr::State=HASH(0x2100ee40)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/Format/JSON.pm line 24
MooseX::Storage::Format::JSON::freeze('ScanCtr::State=HASH(0x2100ee40)') called at /usr/lib/perl5/site_perl/5.8.8/MooseX/Storage/IO/File.pm line 19


Вот моя установка. У меня есть класс под названием "ScanCtr:: ScanMe", и он делает только это:



package ScanCtr::ScanMe;
use Moose;
with 'MooseX::Log::Log4perl';
use namespace::autoclean;
use Log::Log4perl qw(:easy);
BEGIN {
Log::Log4perl->easy_init({
level => $DEBUG,
file => ">>/var/log/sc.log",
layout => '%d %p [%P] %l %m%n',
});
};
1;


Мой другие объекты, в том числе расширить этот объект (что может быть моей проблемой), так что я могу делать вещи, как $self->log->debug("debug message"); внутри каждого из моих объектов. Например:



package ScanCtr::State;
use ScanCtr::Request;
use Moose;
extends 'ScanCtr::ScanMe';
use Moose::Util::TypeConstraints;
use MooseX::Storage;
our $VERSION = '0.01';
with Storage ( 'format' => 'JSON', 'io' => 'File');
use namespace::autoclean;


has 'requests' => (
traits => [ 'Hash' ],
is => 'rw',
isa => 'HashRef[ScanCtr::Request]',
default => sub { {} },
handles => {
count => 'count',
get => 'get',
set => 'set',
delete_request => 'delete',
request_keys => 'keys',
kv => 'kv',
}
);
1;


Итак, есть ли способ исключить MooseX:: Log:: Log4perl из хранилища? Есть ли лучший подход, который позволит избежать этой проблемы? Какие еще ошибки новичка я совершаю?



Спасибо за любую помощь,
Тодд.

452   1  

1 ответ:

Это должно работать (но я его не проверял). Внутри ScanCtr::ScanMe необходимо переопределить атрибут Logger и применить Признак DoNotSerialize из MooseX::Storage.

package ScanCtr::ScanMe;
use Moose;
with 'MooseX::Log::Log4perl';
use namespace::autoclean;
use Log::Log4perl qw(:easy);
BEGIN {
    Log::Log4perl->easy_init({
        level   => $DEBUG,
        file    => ">>/var/log/sc.log",
        layout  => '%d %p [%P] %l %m%n',
    });
};

has '+logger' => { traits => ['DoNotSerialize'] };

1;

Comments

    Ничего не найдено.