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

推荐哪些Perl模块可以序列化Moose对象?,perl,serialization,yaml,moose,coderef,Perl,Serialization,Yaml,Moose,Coderef,我通常将Storable与nstore一起使用,但现在我有了一个code,显然Storable不喜欢这样 我找到了YAML(和YAML::XSwhich)。 我还尝试了一点,但没有多大成功 还有其他选择吗? 你推荐什么?我相信你可以序列化代码引用。不过我自己也没用过。看看吧,它的设计是为了和,所以它应该真的能覆盖所有的角落(注意,我自己没有试过,但我一直想!) /I3az/您可以在将$Data::Dumper::Deparse设置为真值后使用转储coderef,但这仅用于调试目的,不用于序列化

我通常将
Storable
nstore
一起使用,但现在我有了一个
code
,显然
Storable
不喜欢这样

我找到了
YAML
(和
YAML::XS
which)。 我还尝试了一点,但没有多大成功

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

我相信你可以序列化代码引用。不过我自己也没用过。

看看吧,它的设计是为了和,所以它应该真的能覆盖所有的角落(注意,我自己没有试过,但我一直想!)


/I3az/

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

我建议您回到Moose::Storage不适合您的原因上来,因为作者非常努力地为Moose对象序列化提供一个抽象良好且健壮的解决方案


更新:您似乎遇到了序列化
\u offset\u sub
属性的问题,如中所述。由于该属性有一个构建器,并且它的构造相当简单(它只查看另一个属性的当前值),因此您根本不需要序列化它——当您反序列化对象并希望再次使用它时,第一次调用
$this->offset
时将调用该构建器。因此,您应该能够将其标记为“不序列化”:

最后,这有点正交,但您可以折叠偏移量
\u offset\u sub
使用本机属性“code”特征将属性组合在一起:

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

MooseX::存储是推荐的方法。您能否具体说明您在it方面遇到的问题?(也可以随意访问irc.perl.org#moose)为什么要转储代码引用?@brian d foy:我真的不想。请参阅OP中链接的模块。如果您对如何在不使用coderefs的情况下序列化此对象有任何建议,我很乐意采纳。@Ether:首先,
MooseX:Storage
dors不支持coderefs(),我的问题更多的是指“告诉我们您在做什么,以及为什么您认为这是一个解决方案”。你的问题没有背景。你在这里得到了足够的反馈,知道你应该告诉我们你在做什么,而不是孤立你认为问题是什么。如果这真的是你已经问过的同一个问题,选择一个问题并坚持下去,而不是重复努力。它可以,并且只要你理解它记录的警告就行。不过,如果可能的话,我会避免转储coderef。我目前正在查看
KiokuDB
。这看起来很有趣,但实际上我需要序列化单个对象,或者一次只序列化几个对象。我不需要智能搜索等。对于我的情况,使用DB后端等似乎有些过分。KiokuDB实际上不是一个序列化引擎(尽管它有一个),而是一个对象存储。
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...
}