Какие рекомендуемые модули Perl могут сериализовать объекты Moose? - PullRequest
3 голосов
/ 22 октября 2010

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

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

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

Ответы [ 3 ]

6 голосов
/ 23 октября 2010

Вы можете сбросить кодовую ссылку с помощью 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...
}
3 голосов
/ 22 октября 2010

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

/ I3az /

1 голос
/ 22 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...