6

私の問題を実証するために、小さなテストケースをまとめました。

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);

これにより、オブジェクトが出力されると予想されますが、P2 パッケージの「lol」属性は出力されません。ただし、これは次の結果でも確認できます$stored->pack

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

MooseX::Storage を間違って使用していますか、それともバグのある動作のように見えますか?

4

2 に答える 2

1

「何とか」を P3 の isa にすることができます....

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

そして今、Dumper( $stored->pack ) はこれを示しています....

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

この Moose オブジェクトの正しいシリアル化のように見えるのはどれですか?

于 2009-03-07T21:41:17.497 に答える