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

4

我通常使用Storablenstore,但现在我有一个模块,其中包含CODE,显然Storable不喜欢这个。

我发现了YAML(以及YAML::XS,但是我无法真正让它工作)。 我还尝试了一些MooseX::Storage,但没有什么成功的经验。

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


1
你为什么想要转储代码引用? - brian d foy
1
@brian d foy:我真的不知道。请参考原帖中链接的模块。如果您有任何建议,可以在不使用代码引用的情况下对此对象进行序列化,我将很乐意采纳。 - David B
@Ether:首先,MooseX:Storage不支持coderefs(http://search.cpan.org/~bobtfish/MooseX-Storage-0.28/lib/MooseX/Storage.pm#What_can_not_be_serialized?) - David B
1
我的问题更多是想要知道“告诉我们你在做什么以及为什么认为这是一个解决方案”。你的问题没有上下文。你已经得到了足够的反馈,应该告诉我们你正在做什么,而不是孤立地思考问题所在。如果这只是你已经问过的同样的问题,选择一个问题并坚持下去,而不是重复努力。 - brian d foy
@David:哪个原始帖子?几周前有一个你问如何序列化闭包的帖子,我回答说“也许现在是时候退一步考虑序列化子程序是否是一个好主意了?”但我没有看到一个问题的答案包括“你需要序列化整个Moose对象,包括它的方法”。 - Ether
显示剩余2条评论
3个回答

6
您可以通过将$Data::Dumper::Deparse设置为true值,使用Data::Dumper转储coderef,但这仅用于调试目的,而非序列化。
我建议您重新查看为什么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,
);

最后,这有点不相关,但是您可以使用本机属性“Code”特性将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
请查看KiokuDB,它是与Moose一起设计的,因此应该真正涵盖所有细节(注意:我自己还没有尝试过,但我一直打算这样做!)

1
我目前正在研究 KiokuDB。它看起来很有趣,但实际上我只需要序列化单个对象或仅几个对象。我不需要智能搜索等功能。对于我的情况来说,使用数据库后端等似乎有些过度设计。 - David B
KiokuDB并不是一个序列化引擎(虽然它有一个),而是一个对象存储器。 - perigrin

1

只要你理解了它的文档警告,它就可以正常工作。不过如果可能的话,我会避免转储代码引用。 - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接