我通常使用Storable
with nstore
,但现在我有一个具有但显然不喜欢的模块。CODE
Storable
我发现YAML
(而且YAML::XS
我真的无法开始工作)。我还对MooseX::Storage进行了一些实验,但没有取得多大成功。
还有其他选择吗?你会推荐什么?
我通常使用Storable
with nstore
,但现在我有一个具有但显然不喜欢的模块。CODE
Storable
我发现YAML
(而且YAML::XS
我真的无法开始工作)。我还对MooseX::Storage进行了一些实验,但没有取得多大成功。
还有其他选择吗?你会推荐什么?
您可以在设置为真值后使用Data::Dumper转储 coderef $Data::Dumper::Deparse
,但这仅用于调试目的,而不是用于序列化。
我建议您回头看看为什么 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,
);
最后,这有点正交,但您可以使用原生属性“代码”特征将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...
}
我相信Data::Dump::Streamer可以序列化 coderefs。不过自己没用过。