我通常使用Storable
和nstore
,但现在我有一个模块,其中包含CODE
,显然Storable
不喜欢这个。
我发现了YAML
(以及YAML::XS
,但是我无法真正让它工作)。
我还尝试了一些MooseX::Storage,但没有什么成功的经验。
还有其他选择吗? 你会推荐什么?
我通常使用Storable
和nstore
,但现在我有一个模块,其中包含CODE
,显然Storable
不喜欢这个。
我发现了YAML
(以及YAML::XS
,但是我无法真正让它工作)。
我还尝试了一些MooseX::Storage,但没有什么成功的经验。
还有其他选择吗? 你会推荐什么?
$Data::Dumper::Deparse
设置为true值,使用Data::Dumper转储coderef,但这仅用于调试目的,而非序列化。_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...
}
我相信 Data::Dump::Streamer 可以序列化 coderef。虽然我自己没有使用过。
MooseX:Storage
不支持coderefs(http://search.cpan.org/~bobtfish/MooseX-Storage-0.28/lib/MooseX/Storage.pm#What_can_not_be_serialized?) - David B