4

我通常使用Storablewith nstore,但现在我有一个具有但显然不喜欢的模块。CODEStorable

我发现YAML(而且YAML::XS真的无法开始工作)。我还对MooseX::Storage进行了一些实验,但没有取得多大成功。

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

4

3 回答 3

6

您可以在设置为真值后使用Data::Dumper转储 coderef $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...
}
于 2010-10-22T22:11:26.363 回答
3

看一下KiokuDB,它的设计是用 and forMoose所以它应该真的覆盖所有的角落(注意。我自己没有尝试过,但我一直想这样做!)

/I3az/

于 2010-10-22T19:13:08.673 回答
1

我相信Data::Dump::Streamer可以序列化 coderefs。不过自己没用过。

于 2010-10-22T18:43:20.880 回答