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

8

是的,这看起来像一个错误。你能把它变成一个使用 Test::More 的测试并将它提交到 RT 队列,然后有人(可能是我)会解决这个问题。

请注意,如果您 Dump $obj->store 您会看到该特征已正确应用于直接属性,但它似乎在继承过程中丢失了。

您可以在RT中报告针对 MooseX::Storage 的错误

于 2009-03-07T20:50:43.687 回答
1

你可以让'blah'成为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 回答