2009-03-07 9 views
6

tôi đã đặt cùng một trường hợp thử nghiệm nhỏ để chứng minh vấn đề của tôi:Làm thế nào để MooseX :: Lưu trữ dường như không theo đặc điểm thuộc tính đối với một số đối tượng?

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

tôi sẽ mong đợi điều này để in các đối tượng, nhưng không phải là 'lol' thuộc tính trong gói P2 - tuy nhiên, tôi vẫn có thể thấy điều này trong kết quả của $stored->pack

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

Tôi đang sử dụng MooseX :: Lưu trữ sai, hoặc có vẻ như hành vi lỗi?

+2

Tôi biết điều này là cũ, nhưng thực sự nó không có vẻ là một lỗi. Như 'draegtun' chỉ ra, bạn đang thiếu thông tin loại nên thuộc tính 'blah' không thực sự được tuần tự hóa bởi MooseX :: Storage. Nếu nó đã được đăng, bạn sẽ không thấy 'phước lành', mà thay vào đó hãy nhìn thấy phím '__CLASS__'. MooseX :: Lưu trữ hầu hết nó sụp đổ dựa trên ràng buộc kiểu được cung cấp trong thuộc tính, mà không có nó để lại để đoán. –

Trả lời

1

Bạn có thể làm 'blah' một isa của P3 ....

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

và bây giờ Dumper ($ stored-> pack) cho thấy điều này ....

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

trông giống như việc tuần tự hóa chính xác cho đối tượng Moose này?

8

Yup trông giống như một lỗi. Bạn có thể biến điều này thành một thử nghiệm có sử dụng Test :: More và gửi nó đến hàng đợi RT và ai đó (có thể là tôi) sẽ sửa lỗi đó.

Lưu ý rằng nếu bạn Dump $ obj-> store bạn thấy rằng đặc điểm được áp dụng đúng cho thuộc tính trực tiếp nhưng có vẻ như nó bị mất trong quá trình thừa kế.

Bạn có thể thông báo lỗi chống lại MooseX :: Lưu kho trong RT

+0

Vui lòng cung cấp liên kết đến địa điểm để gửi nội dung này? cảm ơn! – Ether