Почему я должен загрузить класс Perl, чтобы использовать его объект, десериализованный из YAML?

Я пытался сериализовать некоторые (Moose) объекты с YAML - просто с помощью YAML Dump() а также Load(), После загрузки сериализованного объекта он не работал, пока я не добавил use оператор с оригинальным именем модуля. Если я не использую use Я не получу никакой ошибки, пока не попытаюсь вызвать какой-либо объектный метод, тогда он выдохнет, сказав, что не может найти этот метод.

Я думал, что загрузка необходимых классов является частью работы десериализатора, и если я не ошибаюсь Storable действительно ли это само по себе. Итак, есть что-нибудь сломанное с YAML?

Также я заметил, что версия модуля не хранится вместе с сериализованным объектом. Есть ли способ добавить это?

2 ответа

Решение

Сериализация для данных, а не поведения. Объект в Perl - это просто благословенная ссылка. YAML и Storable сериализуют и хранят данные (включая благословение), но это только имя класса, а не сам класс. Вы несете ответственность за загрузку класса (и любых родительских классов) при десериализации объекта.

В общем случае сериализаторы не могут загрузить класс. Хотя соглашение состоит в том, что пакет (класс) == имя файла, это не обязательно. Модуль может определить любое имя пакета или несколько пакетов. Например, я мог бы написать модуль с именем AbstractSyntaxTree.pm, который определил классы Node, Branch, а также Leaf,

Также я заметил, что версия модуля не хранится вместе с сериализованным объектом. Есть ли способ добавить это?

Нет, объекты знают только пакет, в который они были благословлены. Вы можете использовать use Module VERSION синтаксис, чтобы требовать некоторую версию модуля в обеих средах.

Другие вопросы по тегам