Почему MooseX::Storage не следует чертам атрибутов для некоторых объектов?

Я собрал небольшой тестовый пример, чтобы продемонстрировать мою проблему:

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

Я ожидал бы, что это напечатает объект, но не атрибут 'lol' в пакете P2, однако я все еще вижу это в результате $stored->pack

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

Я неправильно использую MooseX::Storage или это похоже на ошибочное поведение?


person ocharles    schedule 07.03.2009    source источник
comment
Я знаю, что это старо, но на самом деле это не похоже на ошибку. Как указывает «draegtun», вам не хватает информации о типе, поэтому атрибут «blah» на самом деле вообще не сериализуется MooseX::Storage. Если бы он был сериализован, вы бы не увидели «благословение», а вместо этого увидели бы ключ «CLASS». MooseX::Storage больше всего сворачивается на основе ограничения типа, предоставленного в атрибуте, без которого остается только догадываться.   -  person Stevan Little    schedule 01.02.2011


Ответы (2)


Вы можете сделать «бла» isa P3 ....

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

и теперь Dumper($stored->pack) показывает это....

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

который выглядит как правильная сериализация для этого объекта Moose?

person draegtun    schedule 07.03.2009

Да, это похоже на ошибку. Можете ли вы превратить это в тест, использующий Test::More, и отправить его в очередь RT, и кто-нибудь (вероятно, я) это исправит.

Обратите внимание, что если вы сделаете дамп $obj->store, вы увидите, что трейт правильно применяется к прямому атрибуту, но кажется, что он теряется в процессе наследования.

Вы можете сообщать об ошибках в MooseX::Storage в RT

person perigrin    schedule 07.03.2009