哪些推荐的Perl模块可以序列化Moose对象?

时间:2010-10-22 18:36:49

标签: perl serialization yaml moose coderef

我通常使用Storablenstore,但现在我有module CODE,显然Storable不喜欢。{ / p>

我找到YAML(和YAML::XS I can't really get to work)。 我还对MooseX::Storage进行了一些实验,但没有取得多大成功。

还有其他选择吗? 你会推荐什么?

3 个答案:

答案 0 :(得分:6)

在将$Data::Dumper::Deparse设置为true值后,可以使用Data::Dumper转储coderef,但这仅用于调试目的,而不是用于序列化。

我建议你回过头来看看为什么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使用原生属性“代码”特征将属性归为一类:

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...
}

答案 1 :(得分:3)

看看KiokuDB,它的设计和Moose,所以它应该覆盖所有的角落(注意。我自己没有尝试过,但我保持意义!)

/ I3az /

答案 2 :(得分:1)

我相信Data::Dump::Streamer可以序列化coderef。但是我自己没有用过它。