Есть ли причина, по которой я НЕ должен сериализовать свои (Moose) объекты, используя Storable или YAML? - PullRequest
4 голосов
/ 27 октября 2010

У меня есть несколько объектов Moose и некоторые другие простые хеш-объекты (хэши, массивы), которые я хотел бы сериализовать.

Сначала я использовал простой

my $obj_store_file = nstore($obj);

и

my $obj = retrieve($obj_store_file);

Это сработало хорошо.

Позже я нашел около MooseX::Storage и KiokuDB. Я пытался использовать их, чтобы получить некоторые преимущества, которые они имеют, но:

  • MooseX::Storage, казалось, воссоздает объекты, на которые ссылаются несколько раз. Например, один из моих сериализованных объектов содержит несколько атрибутов, каждый из которых относится к одному и тому же экземпляру другого объекта. До сериализации все эти ссылки, очевидно, одинаковы - все они указывают на один и тот же объект. После сериализации / десериализации с использованием MooseX::Storage этот один объект дублируется, и каждая ссылка указывает на другой экземпляр объекта. Мне сказали, что MooseX::Storage не подходит для представления графов объектов и что я могу попробовать KiokuDB.
  • Я так и сделал, хотя я чувствовал, что KiokuDB - это излишество для моих нужд. Мне не нужны все модные вещи, которые БД может предложить. К сожалению, поскольку один из моих объектов действительно большой и заполняет память при сериализации с использованием значений по умолчанию, мне кажется, что мне нужно написать собственный сериализатор или сохранить его часть данных отдельно, а затем написать костюм KiokuX::Module ... излишество.

Итак, я вернулся к обычному Storable или YAML. Мой вопрос прост: да, есть некоторые преимущества для KiokuDB (особенно тот факт, что он поддерживает граф объектов) и, возможно, также для MooseX::Storage (хотя я не мог найти что-либо для последнего). Но, учитывая, что эти преимущества на самом деле мне не нужны, есть ли причина не использовать Storable или YAML?

Другими словами, что-то не так с хранением (Moose) объекта таким образом? Это «незаконно»?

1 Ответ

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

По моему опыту, это зависит от того, почему вы сериализуете данные.Мне нравится Storable для состояния программы, включая такие, как размер / положение окна.Я предпочитаю YAML для данных конфигурации или всего, что вы хотите обменять с другой копией приложения.(т. е. обмен между пользователями - файл Storable может быть недоступен для чтения пользователем с другой версией Perl или Storable.) Storable поддерживает графы объектов (при условии, что замораживание / оттаивание выполнено правильно).Я не уверен насчет YAML.

...