Corda не позволяет десериализовать весь класс по умолчанию, потому что вокруг него есть известные эксплойты и уязвимости. Следовательно, Corda позволяет десериализовать только классы из белого списка. Классы могут быть просто внесены в белый список, используя аннотацию @CordaSerializable
поверх вашего класса.
По умолчанию, Корда внесла в белый список некоторые классы для вас , отметьте здесь . Если класс, который вы хотите добавить в белый список, отсутствует здесь, вам придется занести его в белый список.
Вот поток, который обеспечивает пару различных вариантов: несамосвал
Если Вы просто ищете персистентность данных, модуль Storable мог бы быть Вашим лучшим выбором.
Как другие уже сказали, Вы, вероятно, были бы более обеспеченным хранением данных в лучшем формате сериализации:
Лично, я думаю, что стремился бы к YAML или JSON... Вы не можете стать намного легче, чем:
my $data = YAML::Any::LoadFile($filename);
По умолчанию, Данные:: вывод Самосвала не может быть проанализирован оценкой, особенно если выводимая структура данных является круговой в некотором роде. Однако можно установить
$Data::Dumper::Purity = 1;
или
$obj->Purity(1);
где obj
Данные:: объект Самосвала. Любой из них вызовет Данные:: Самосвал для создания вывода, который может быть проанализирован оценкой.
Посмотрите Данные:: Самосвал documenatation в CPAN для всех подробностей.
Как Rich говорит, Вы, вероятно, не хотите использовать Данные:: Самосвал для персистентности, а скорее чего-то как Storable.
Однако отвечать на вопрос, который задают... IIRC, Данные:: Самосвал не объявляет, что Ваши переменные my
, таким образом, Вы делаете это сами так или иначе?
Смочь к eval
данные въезжают задним ходом, переменная не должна быть my
в оценке. Если Ваш текстовый файл содержал это:
$x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
Затем это работало бы:
my $vars;
{
undef $/;
$vars = <FILE>;
}
my $x;
eval $vars;
print $x;
Если Вы хотите остаться с чем-то легким и человекочитаемым, просто используйте Data::Dump
модуль вместо Data::Dumper
. В основном это Data::Dumper
сделанный правильно - это производит допустимые выражения Perl, готовые к присвоению, не создавая все странные $VAR1
, $VAR2
и т.д. переменные.
Затем если Ваш код похож:
my $x = [ { foo => 'bar', asdf => undef }, 0, -4, [ [] ] ];
Сохраните его использование:
use Data::Dump "pp";
open F, ">dump.txt";
print F pp($x);
Это производит файл dump.txt
это похоже (на моем ПК, по крайней мере):
[{ asdf => undef, foo => "bar" }, 0, -4, [[]]]
Загрузка это использование:
open F, "dump.txt";
my $vars;
{ local $/ = undef; $vars = <F>; }
my $x = eval $vars;
Отметьте это
$/
в его собственном блоке необходимо использовать local
для обеспечения это - значение, на самом деле восстанавливается в конце блока; иeval()
потребности, которым присвоят $x
.Вы уверенный, что файл был создан Данными:: Самосвал? Не должно быть a my
там.
Некоторыми другими опциями является Storable, YAML или DBM:: Глубоко. Я прохожу некоторые примеры в главе "Персистентности" Освоения Perl.
Удача, :)
Я думаю, что Вы хотите поместить
our $x;
в Ваш код прежде, чем получить доступ к x. Это удовлетворит строгую проверку ошибок.
Однако я присоединяюсь к другой речи в предложении Storable.
Это хорошо работает для меня:
Выписывание:
open(my $C, qw{>}, $userdatafile) or croak "$userdatafile: $!";
use Data::Dumper;
print $C Data::Dumper->Dump([\%document], [qw(*document)]);
close($C) || croak "$userdatafile: $!";
Чтение в:
open(my $C, qw{<}, $userdatafile) or croak "$userdatafile: $!";
local $/ = $/;
my $str = <$C>;
close($C) || croak "$userdatafile: $!";
eval { $str };
croak $@ if $@;
Этот фрагмент короткий и работал у меня (я читал в массиве). Он берет имя файла из первого аргумента скрипта.
# Load in the Dumper'ed library data structure and eval it
my $dsname = $ARGV[0];
my @lib = do "$dsname";