我通常使用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