Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么MooseX::存储不';有些对象似乎没有遵循属性特征?_Perl_Serialization_Moose - Fatal编程技术网

Perl 为什么MooseX::存储不';有些对象似乎没有遵循属性特征?

Perl 为什么MooseX::存储不';有些对象似乎没有遵循属性特征?,perl,serialization,moose,Perl,Serialization,Moose,我准备了一个小测试用例来演示我的问题: 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 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是错误的,还是这看起来像bug行为?

是的,看起来像bug。您能否将其转换为使用test::More的测试,并将其提交到RT队列,然后有人(可能是我)会解决这个问题

注意,如果转储$obj->store,您会看到trait正确地应用于direct属性,但它似乎在继承过程中丢失了


您可以在

中报告针对MooseX::Storage的bug您可以将“blah”作为P3的isa

has 'blah' => (
    is  => 'rw',
    isa => 'P3',
);
现在Dumper($stored->pack)显示了这个

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

对于这个Moose对象,哪一个看起来是正确的序列化?

我知道这是旧的,但实际上它似乎不是一个bug。正如“draegtun”所指出的,您缺少类型信息,因此“blah”属性实际上根本没有被MooseX::Storage序列化。如果它被序列化,您将不会看到“bless”,而是看到“CLASS”键。MooseX::Storage做的最多——它根据属性中提供的类型约束进行崩溃,如果没有类型约束,它就只能猜测了。