2010-10-22 74 views
3

我通常使用Storablenstore,但现在我有一个moduleCODE和显然Storable不喜欢那样。哪个推荐的Perl模块可以序列化Moose对象?

我发现YAML(和YAML::XS其中I can't really get to work)。 我也尝试了一下MooseX::Storage没有太大的成功。

是否有其他的选择? 你会推荐什么?

+0

MooseX :: Storage是推荐的方法。你能具体谈谈你遇到的问题吗? (随意弹出到irc.perl.org #moose。) – Ether 2010-10-22 19:18:53

+1

为什么你想转储coderefs? – 2010-10-22 21:24:39

+1

@brian d foy:我真的不知道。查看OP中链接的模块。如果你有任何建议如何序列化这个对象而不使用coderefs,我会很乐意采用它。 – 2010-10-22 22:45:49

回答

6

您可以设置$Data::Dumper::Deparse真实值后转储CODEREF与Data::Dumper,但这只是用于调试目的,不进行序列化。

我建议你回头看看为什么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... 
} 
+2

干得好!我已经迁移到'MooseX :: Storage'。 – 2010-10-24 15:50:24

1

我相信Data::Dump::Streamer可以序列化coderefs。尽管我自己并没有使用它。

+0

只要您了解其记录的警告,它就可以,并且可以正常工作。如果可能的话,我会尽量避免抛弃coderefs。 – 2010-10-22 21:24:17

3

看一看KiokuDB,其设计和为Moose所以它应该覆盖所有的角落(NB。我还没有尝试过自己,但我一直意思!)

/I3az/

+1

我目前正在查看'KiokuDB'。看起来很有趣,但实际上我需要序列化一个对象或者只有一些对象。我不需要聪明的搜索等使用数据库后端等似乎对我的情况矫枉过正。 – 2010-10-22 23:50:53

+0

KiokuDB实际上不是一个序列化引擎(尽管它有一个),而是一个Object Store。 – perigrin 2011-02-18 20:56:30

相关问题