Я пытаюсь добавить сериализацию в класс Moose, который имеет обязательные атрибуты, используя настраиваемые init_arg (с префиксом имени атрибута с тире для согласованности API), и кажется, что это приводит к сбою распаковки. Я настроил тестовый пример ниже, чтобы проиллюстрировать свою точку зрения.
use strict;
use warnings;
package MyClass1;
use Moose;
use MooseX::Storage;
use namespace::autoclean;
with Storage;
has 'my_attr' => (
is => 'ro',
isa => 'Str',
required => 1,
);
__PACKAGE__->meta->make_immutable;
package MyClass2;
use Moose;
use MooseX::Storage;
use namespace::autoclean;
with Storage;
has 'my_attr' => (
is => 'ro',
isa => 'Str',
required => 1,
init_arg => '-my_attr',
);
__PACKAGE__->meta->make_immutable;
package main;
my $inst1 = MyClass1->new(my_attr => 'The String');
my $packed1 = $inst1->pack;
my $unpacked1 = MyClass1->unpack($packed1); # this works
my $inst2 = MyClass2->new(-my_attr => 'The String');
my $packed2 = $inst2->pack;
my $unpacked2 = MyClass2->unpack($packed2); # this fails with a ...
# ... Attribute (my_attr) is required at ...
Обновление: дальнейшее расследование показывает, что проблема заключается в том, что init_arg не учитывается при упаковке. Следовательно, даже необязательный атрибут с использованием пользовательского init_arg не будет правильно восстановлен после распаковки. См. этот дополнительный тестовый пример:
package MyClass3;
with Storage;
has 'my_attr' => (
is => 'ro',
isa => 'Str',
init_arg => '-my_attr',
);
# in main...
my $inst3 = MyClass3->new(-my_attr => 'The String');
my $packed3 = $inst3->pack;
my $unpacked3 = MyClass3->unpack($packed3); # this seems to work ...
say $unpacked3->my_attr; # ... but my_attr stays undef
Большое спасибо за помощь, Денис