2010-10-22 2 views
3

Обычно я использовал Storable с nstore, но теперь у меня есть module, который имеет CODE и, видимо, Storable не нравится.Какие рекомендуемые модули Perl могут сериализовать объекты Moose?

Я нашел YAMLYAML::XS, который I can't really get to work). Я также немного экспериментировал с MooseX::Storage без особого успеха.

Есть ли другие альтернативы? Что вы посоветуете?

+0

MooseX :: Хранение - рекомендуемый метод. Можете ли вы говорить о проблемах, с которыми вы сталкиваетесь? (Не стесняйтесь всплывать на irc.perl.org #moose.) – Ether

+1

Почему вы хотите сбрасывать coderefs? –

+1

@brian d foy: Я действительно этого не делаю. См. Модуль, связанный в OP. Если у вас есть предложение о сериализации этого объекта без использования coderefs, я буду рад принять его. –

ответ

6

Вы можете сбросить код с Data::Dumper после установки $Data::Dumper::Deparse в истинное значение, но это предназначено только для целей отладки, а не для сериализации.

Я бы посоветовал вам вернуться к рассмотрению вопроса о том, почему MooseX :: Storage не работает для вас, поскольку авторы очень старались представить хорошо отвлеченное и надежное решение для сериализации объектов Moose.


Обновление: похоже, что вы работаете в вопросах сериализации атрибут _offset_sub, как описано в this question. Поскольку у этого атрибута есть построитель, и его конструкция довольно тривиальна (он просто смотрит на текущее значение другого атрибута), вам не нужно сериализовать его вообще - когда вы десериализуете свой объект и хотите его использовать снова, строитель будет вызываться при первом вызове $this->offset. Следовательно, вы должны просто быть в состоянии пометить его как «не сериализовать»:

use MooseX::Storage; 

has '_offset_sub' => (
    is  => 'ro', 
    isa  => 'CodeRef', 
    traits => [ 'DoNotSerialize' ], 
    lazy  => 1, 
    builder => '_build_offset_sub', 
    init_arg => undef, 
); 

Наконец, это несколько ортогональны, но вы можете сложить offset и _offset_sub атрибуты вместе, используя родной атрибут «Code» знак:

has offset => (
    is   => 'bare', 
    isa   => 'CodeRef', 
    traits  => [ qw(Code DoNotSerialize) ], 
    lazy  => 1, 
    builder  => '_build_offset', 
    init_arg => undef, 
    handles  => { 
     offset => 'execute_method', 
    }, 
); 

sub _build_offset { 
    my ($self) = @_; 

    # same as previous _build_offset_sub... 
} 
+2

Молодцы! Я перешел в «MooseX :: Storage». –

1

Я считаю, Data::Dump::Streamer может сериализовать coderefs. Не использовал его сам, хотя.

+0

Он может и работает нормально, если вы понимаете его документированные оговорки. Тем не менее, я бы избежал демпинга coderefs. –

3

Посмотрите KiokuDB, его разработан с и Moose поэтому она должна действительно охватить все углы (NB. Я не пробовал сам, но я держу смысл!)

/I3az/

+1

Я сейчас смотрю 'KiokuDB'. Это кажется интересным, но на самом деле мне нужно сериализовать один объект или только пару объектов. Мне не нужны интеллектуальные поиски и т. Д. Использование бэкэндов БД и т. Д. Кажется излишним для моего дела. –

+0

KiokuDB действительно не является механизмом сериализации (хотя он и есть), но является хранилищем объектов. – perigrin