2009-03-07 6 views
6

Ich habe zusammen einen kleinen Test Fall setzen, mein Problem zu demonstrieren:Wie kommt es, dass MooseX :: Storage bei einigen Objekten nicht den Attributen zu folgen scheint?

package P1; 
use Moose; 
use MooseX::Storage; 
with Storage; 

has 'blah' => (
    is => 'rw', 
); 

package P2; 
use Moose; 
use MooseX::Storage; 
with Storage; 

has 'lol' => (
    is => 'rw', 
    traits => ['DoNotSerialize'] 
); 

package P3; 
use Moose; 
extends 'P2'; 

has 'magic' => (
    is => 'rw', 
); 

package Test; 
my $obj = P3->new(
    magic => 'This ok!', 
    lol => sub { 'weee' } 
); 

my $stored = P1->new(blah => $obj); 

use Data::Dumper; print Dumper ($stored->pack); 

Ich würde erwarten, dass dies das Objekt drucken, aber nicht das ‚lol‘ Attribut in dem P2-Paket - aber das kann ich noch sehen im Ergebnis der $stored->pack

$VAR1 = { 
      '__CLASS__' => 'P1', 
      'blah' => bless({ 
          'magic' => 'This ok!', 
          'lol' => sub { "DUMMY" } 
          }, 'P3') 
     }; 

Bin ich mit MooseX :: Speichern falsch, oder dies wie Buggy Verhalten aus?

+2

Ich weiß, das ist alt, aber eigentlich scheint es kein Fehler zu sein. Wie 'draegtun' herausfindet, fehlt dir die Typinformation, so dass das Attribut 'blah' von MooseX :: Storage überhaupt nicht serialisiert wird. Wenn es serialisiert wurde, würden Sie das "segne" nicht sehen, sondern stattdessen die Taste "__CLASS__". MooseX :: Storage kollabiert am meisten basierend auf der Typbeschränkung, die im Attribut angegeben ist, ohne dass es raten würde. –

Antwort

1

Sie können 'blah' ein isa von P3 machen ....

has 'blah' => (
    is => 'rw', 
    isa => 'P3', 
); 

und jetzt Dumper ($ stored-> pack) zeigt dies ....

$VAR1 = { 
     '__CLASS__' => 'P1', 
     'blah' => { 
        '__CLASS__' => 'P3', 
        'magic' => 'This ok!' 
       } 
}; 

die aussieht wie die richtige Serialisierung für dieses Moose-Objekt?

8

Yup, das aussieht wie ein Fehler. Kannst du dies in einen Test verwandeln, der Test :: More benutzt und ihn in die RT-Queue schickt und jemand (wahrscheinlich ich) wird das beheben.

Beachten Sie, dass Sie, wenn Sie $ obj-> speichern, sehen, dass das Merkmal korrekt auf das direkte Attribut angewendet wird, aber es scheint, dass es während des Vererbungsprozesses verloren geht.

Sie können Fehler melden gegen MooseX :: Lagerung in RT

+0

Bitte geben Sie einen Link zu dem Ort, an dem Sie das einreichen können? Vielen Dank! – Ether

Verwandte Themen