我通常使用Storable
与nstore
,但现在我有module CODE
,显然Storable
不喜欢。{ / p>
我找到YAML
(和YAML::XS
I can't really get to work)。
我还对MooseX::Storage进行了一些实验,但没有取得多大成功。
还有其他选择吗? 你会推荐什么?
答案 0 :(得分:6)
在将$Data::Dumper::Deparse
设置为true值后,可以使用Data::Dumper转储coderef,但这仅用于调试目的,而不是用于序列化。
我建议你回过头来看看为什么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...
}
答案 1 :(得分:3)
答案 2 :(得分:1)
我相信Data::Dump::Streamer可以序列化coderef。但是我自己没有用过它。