2010-10-22 36 views
3

我通常使用Storablenstore,但現在我有一個moduleCODE和顯然Storable不喜歡那樣。哪個推薦的Perl模塊可以序列化Moose對象?

我發現YAML(和YAML::XS其中I can't really get to work)。 我也嘗試了一下MooseX::Storage沒有太大的成功。

是否有其他的選擇? 你會推薦什麼?

+0

MooseX :: Storage是推薦的方法。你能具體談談你遇到的問題嗎? (隨意彈出到irc.perl.org #moose。) – Ether 2010-10-22 19:18:53

+1

爲什麼你想轉儲coderefs? – 2010-10-22 21:24:39

+1

@brian d foy:我真的不知道。查看OP中鏈接的模塊。如果你有任何建議如何序列化這個對象而不使用coderefs,我會很樂意採用它。 – 2010-10-22 22:45:49

回答

6

您可以設置$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... 
} 
+2

幹得好!我已經遷移到'MooseX :: Storage'。 – 2010-10-24 15:50:24

1

我相信Data::Dump::Streamer可以序列化coderefs。儘管我自己並沒有使用它。

+0

只要您瞭解其記錄的警告,它就可以,並且可以正常工作。如果可能的話,我會盡量避免拋棄coderefs。 – 2010-10-22 21:24:17

3

看一看KiokuDB,其設計和爲Moose所以它應該覆蓋所有的角落(NB。我還沒有嘗試過自己,但我一直意思!)

/I3az/

+1

我目前正在查看'KiokuDB'。看起來很有趣,但實際上我需要序列化一個對象或者只有一些對象。我不需要聰明的搜索等使用數據庫後端等似乎對我的情況矯枉過正。 – 2010-10-22 23:50:53

+0

KiokuDB實際上不是一個序列化引擎(儘管它有一個),而是一個Object Store。 – perigrin 2011-02-18 20:56:30

相關問題