Есть ли причина, по которой я НЕ должен сериализовать свои (Moose) объекты с помощью Storable или YAML?

У меня есть несколько объектов 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... снова, довольно излишняя.

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

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


person David B    schedule 27.10.2010    source источник


Ответы (1)


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

person Michael Carman    schedule 27.10.2010
comment
Я храню объекты только для собственного последующего использования. Я не хочу каждый раз создавать их заново (некоторые из них требуют серьезной предварительной обработки). Что мне нравится в YAML, так это возможность просматривать сам сохраненный файл. Приятно видеть, что там происходит. Кажется, YAML также поддерживает графы объектов - он использует внутренние указатели, но меня беспокоит, почему он не загружает нужные классы автоматически. - person David B; 27.10.2010