【问题标题】:Which recommended Perl modules can serialize Moose objects?哪些推荐的 Perl 模块可以序列化 Moose 对象?
【发布时间】:2010-10-22 18:36:49
【问题描述】:

我通常使用Storablenstore,但现在我有一个moduleCODE,显然Storable 不喜欢这样。

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

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

【问题讨论】:

  • MooseX::Storage 是推荐的方法。您能具体说明您遇到的问题吗? (也可以随意访问 irc.perl.org #moose。)
  • 为什么要转储代码引用?
  • @brian d foy:我真的不知道。请参阅 OP 中链接的模块。如果您对如何在不使用 coderefs 的情况下序列化此对象有任何建议,我很乐意采纳。
  • @Ether: 对于初学者,MooseX:Storage dors 不支持 coderefs (search.cpan.org/~bobtfish/MooseX-Storage-0.28/lib/MooseX/…)
  • 我的问题更多是在“告诉我们你在做什么以及为什么你认为这是一个解决方案”的意义上。你的问题没有上下文。您在这里得到了足够多的反馈,知道您应该告诉我们您在做什么,而不是孤立您认为问题所在。如果这确实与您已经提出的问题相同,请选择一个问题并坚持下去,而不是重复努力。

标签: perl serialization yaml moose coderef


【解决方案1】:

在将$Data::Dumper::Deparse 设置为真值后,您可以使用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 属性一起使用原生属性 'Code' trait:

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】:

    看看KiokuDB,它是为Moose设计的,所以它应该真正覆盖所有角落(注意。我自己没有尝试过,但我一直想尝试!)

    /I3az/

    【讨论】:

    • 我目前正在查看KiokuDB。看起来很有趣,但我实际上需要一次序列化一个对象或只序列化几个对象。我不需要智能搜索等。使用数据库后端等对我来说似乎有点过头了。
    • KiokuDB 实际上不是一个序列化引擎(虽然它有一个),而是一个对象存储。
    【解决方案3】:

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

    【讨论】:

    • 只要您了解其记录在案的警告,它就可以并且工作正常。如果可能的话,我会避免转储代码引用。
    猜你喜欢
    • 2013-01-13
    • 2018-03-27
    • 2018-09-05
    • 1970-01-01
    • 2011-12-08
    • 2012-06-10
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多