Какие рекомендуемые модули Perl могут сериализовать объекты Moose?

Обычно я использовал Storable с nstore, но теперь у меня есть модуль с CODE, и, видимо, Storable это не нравится.

Я нашел YAMLYAML::XS, которые я не могу приступить к работе). Я также немного поэкспериментировал с MooseX::Storage, но без особого успеха.

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


person David B    schedule 22.10.2010    source источник
comment
MooseX::Storage — рекомендуемый метод. Можете ли вы конкретно рассказать о проблемах, с которыми вы сталкиваетесь? (Также не стесняйтесь заходить на irc.perl.org #moose.)   -  person Ether    schedule 22.10.2010
comment
Почему вы хотите сбросить кодовые ссылки?   -  person brian d foy    schedule 23.10.2010
comment
@brian d foy: я действительно не знаю. См. модуль, связанный в OP. Если у вас есть предложения, как сериализовать этот объект без использования кодовых ссылок, я буду рад их принять.   -  person David B    schedule 23.10.2010
comment
@Ether: во-первых, MooseX:Storage dors не поддерживают кодовые ссылки (search.cpan.org/~bobtfish/MooseX-Storage-0.28/lib/MooseX/)   -  person David B    schedule 23.10.2010
comment
Я имел в виду свой вопрос гораздо больше в смысле «Расскажите нам, что вы делаете и почему вы думаете, что это решение». В вашем вопросе нет контекста. Вы получили здесь достаточно отзывов, чтобы знать, что вы должны рассказывать нам, что вы делаете, а не изолировать то, что, по вашему мнению, является проблемой. Если это действительно тот же самый вопрос, который вы уже задавали, выберите один вопрос и придерживайтесь его, а не дублируйте усилия.   -  person brian d foy    schedule 23.10.2010
comment
@brian d foy: см. ссылку на мой модуль в ОП. Это точно объясняет, что я делаю (модуль прямо здесь, и я просто хочу сериализовать его экземпляры). Это не тот же вопрос, а тот же модуль. Раньше меня просили разделять вопросы и не задавать несколько вещей вместе, даже если они относятся к одному фрагменту кода, и я стараюсь следовать этому правилу.   -  person David B    schedule 23.10.2010
comment
@David: какой оригинальный пост? несколько недель назад вы спрашивали, как сериализовать замыкания, на что я ответил. Возможно, пришло время сделать шаг назад и подумать, является ли сериализация сабвуферов хорошей идеей? Но я не вижу вопроса, ответ на который включает в себя необходимость сериализации всего объекта Moose, включая его методы.   -  person Ether    schedule 23.10.2010
comment
@David: я обновил свой ответ.   -  person Ether    schedule 23.10.2010


Ответы (3)


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

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


Обновление: похоже, у вас возникли проблемы с сериализацией атрибута _offset_sub, как описано в этот вопрос . Поскольку у этого атрибута есть построитель, и его конструкция довольно тривиальна (он просто смотрит на текущее значение другого атрибута), вам вообще не нужно сериализовать его — когда вы десериализуете свой объект и хотите использовать его снова, построитель будет вызван при первом вызове $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 вместе, используя трейт собственного атрибута «Код»:

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...
}
person Ether    schedule 22.10.2010

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

/I3az/

person draegtun    schedule 22.10.2010
comment
В настоящее время я смотрю на KiokuDB. Это кажется интересным, но на самом деле мне нужно сериализовать один объект или только пару объектов за раз. Мне не нужен интеллектуальный поиск и т. д. Использование бэкэндов БД и т. д. кажется излишним для моего случая. - person David B; 23.10.2010
comment
KiokuDB на самом деле не механизм сериализации (хотя он у него есть), а хранилище объектов. - person perigrin; 18.02.2011

Я считаю, что Data::Dump::Streamer может сериализовать кодовые ссылки. Хотя сам не пользовался.

person Eric Strom    schedule 22.10.2010
comment
Это возможно, и работает нормально, если вы понимаете его задокументированные предостережения. Однако я бы не стал сбрасывать кодовые ссылки, если это возможно. - person brian d foy; 23.10.2010