我通常使用Storable
与nstore
,但现在我有一个module有CODE
和显然Storable
不喜欢那样。哪个推荐的Perl模块可以序列化Moose对象?
我发现YAML
(和YAML::XS
其中I can't really get to work)。 我也尝试了一下MooseX::Storage没有太大的成功。
是否有其他的选择? 你会推荐什么?
我通常使用Storable
与nstore
,但现在我有一个module有CODE
和显然Storable
不喜欢那样。哪个推荐的Perl模块可以序列化Moose对象?
我发现YAML
(和YAML::XS
其中I can't really get to work)。 我也尝试了一下MooseX::Storage没有太大的成功。
是否有其他的选择? 你会推荐什么?
您可以设置$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...
}
干得好!我已经迁移到'MooseX :: Storage'。 – 2010-10-24 15:50:24
我相信Data::Dump::Streamer可以序列化coderefs。尽管我自己并没有使用它。
只要您了解其记录的警告,它就可以,并且可以正常工作。如果可能的话,我会尽量避免抛弃coderefs。 – 2010-10-22 21:24:17
MooseX :: Storage是推荐的方法。你能具体谈谈你遇到的问题吗? (随意弹出到irc.perl.org #moose。) – Ether 2010-10-22 19:18:53
为什么你想转储coderefs? – 2010-10-22 21:24:39
@brian d foy:我真的不知道。查看OP中链接的模块。如果你有任何建议如何序列化这个对象而不使用coderefs,我会很乐意采用它。 – 2010-10-22 22:45:49