2011-05-23 41 views
7

一個木對象。我希望能夠到一個對象寫入(我一直在使用use MooseX::Storage; with Storage('io' => 'StorableFile');一個文件,這個對象有一個PDL的屬性。PDL::IO::Storable提供必要的方法,以這種方式使用Storable,但我在一個頭緒要做到這一點在穆斯商店具有PDL,因爲我是新來的駝鹿和做得相當不錯,直到我擊中使用PDL作爲屬性碰釘子屬性

下面是一個例子,這是一個有點長,我知道,但它是最小的,因爲我可以把它:

#!/usr/bin/perl 

package LinearPDL; 
use Moose; 

use PDL::Lite; 
use PDL::IO::Storable; 

use MooseX::Storage; 
with Storage('io' => 'StorableFile'); 

has 'length' => (is => 'ro', isa => 'Num', required => 1); 
has 'divisions' => (is => 'ro', isa => 'Int', required => 1); 
has 'linear_pdl' => (is => 'ro', isa => 'PDL', lazy => 1, builder => '_build_pdl'); 

sub _build_pdl { 
    my $self = shift; 

    my $pdl = $self->length()/($self->divisions() - 1) * PDL::Basic::xvals($self->divisions()); 

    return $pdl; 
} 

no Moose; 
__PACKAGE__->meta->make_immutable; 

use strict; 
use warnings; 

my $linear_pdl = LinearPDL->new('length' => 5, 'divisions' => 10); 
print $linear_pdl->linear_pdl; 

$linear_pdl->store('file'); # blows up here! 

my $loaded_lpdl = load('file'); 
print $loaded_lpdl->linear_pdl; 

我想我可能要做出一個PDL型或甚至包裹PDL到的東西(使用MooseX::NonMoose::InsideOut),但也許有人能救我從(或點我沿着正確的道路,如果它是)。

回答

7

你不說究竟出了問題。在猜測你需要告訴MooseX::Storage如何處理使用PDL對象的可保存掛鉤PDL對象。在MooseX ::存儲此功能的文檔是非常差,但MooseX ::存儲::發動機具有add_custom_type_handler()方法,需要一個類型名(PDL你的情況)和處理程序的HashRef。

MooseX::Storage::Engine->add_custom_type_handler(
    'PDL' => (
     expand => sub { my ($data) = @_; ... }, 
     collapse => sub { my ($object) = @_; ... }, 
    ) 
); 

請蕩過去對irc.perl.org或駝鹿郵件列表#moose和要求。

[編輯:更新基於該tests一個例子]

+1

這看起來很有希望,你可以擴大一點嗎?我是否在類定義中創建'$ engine'對象?擴展和崩潰的輸入和輸出是什麼?有沒有更好的文檔或教程可以找到的地方?謝謝! – 2011-05-23 23:50:16

+0

Joel不幸的是這是MooseX :: Storage的記錄不足部分。這就是爲什麼我建議與irc頻道和/或名單談話。我早些時候對MooseX :: Storage做了一個快速瀏覽[源文件](http://cpansearch.perl.org/src/BOBTFISH/MooseX-Storage-0.30/lib/MooseX/Storage/Engine.pm),因爲我知道此功能存在,但不記得如何/在哪裏。 – perigrin 2011-05-24 02:06:34

+1

然後我發佈最後的評論,然後意識到我可以看看測試套件,發現[示例](http://cpansearch.perl.org/src/BOBTFISH/MooseX-Storage-0.30/t/006_w_custom_type_handlers.t)正是你想要的。 – perigrin 2011-05-24 02:11:30

1

喬爾和perigrin響應的問題幫我解決了一直坐在我的腦海裏了一會兒後的存儲問題。我在這裏發佈一個工作示例。它不使用PDL,但它是相關的,並可能在未來幫助某人。

{ 
package MVR; 
use Moose; 
use MooseX::Storage; 
use Math::Vector::Real; 
use Data::Structure::Util qw (unbless); 

with Storage('format' => 'JSON', 'io' => 'File'); 

MooseX::Storage::Engine->add_custom_type_handler(
    'Math::Vector::Real' => (
     expand => sub {my $v = shift; Math::Vector::Real->new(@{$v})}, 
     collapse => sub {my $mvr = shift; return (unbless($mvr)) }, 
) 
); 

has 'mvr' => (is => 'rw', isa => 'Math::Vector::Real'); 

1; 
} 

use Math::Vector::Real; 
my $p = MVR->new(mvr => V(0,1,3)); 

print $p->dump; 
$p->store('my_point.json'); 

my $p1 = MVR->load('my_point.json'); 

print $p1->dump; 
相關問題