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

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

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

Кроме того, я заметил, что версия модуля нехранится с сериализованным объектом.Любой способ добавить это?

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

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

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

2 голосов
/ 27 октября 2010

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

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

...