![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
KSURi |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Возникла необходимость сохранить в сессии пользователя объект, в котором один из атрибутов является экземпляром DBI. Объект соотвественно надо сериализировать.
Пробую через Storable:
dclone($a), это тоже самое, что и Storable::thaw(Storable::freeze($a)). Вобщем Storable честно предупредил, что не может сериализовать DBI. Пробую через FreezeThaw:
Как видно, десериализованная переменная уже не является экземпляром DBI =( Итак, вопрос: существует ли возможность каким-то образом сереалиазовать экземпляр DBI, естествено не потеряв при этом его работоспособность? -------------------- Died at Life.pl line 21 |
||||
|
|||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Как верно подметили в рекламе: "Нет, сынок, это фантастика!"
Честно говоря, даже в голову не приходила такая идея. KSURi, можете указать мотивы, которые Вами движут в направлении сериализации объекта DBI? Я бы передавал идентификатор типа соединения, если их может быть несколько. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Мне надо не просто DBI упрятать в сессию, а другой объект, один из атрибутов которого - DBI. Редизайнить класс, чтобы не хранить в его экземплярах DBI - самый крайний вариант, почти даже не вариант)
-------------------- Died at Life.pl line 21 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Я бы перед сериализацией заменил объект DBI внутри другого объекта на идентификатор типа соединения (если требуется), а при восстановлении объекта сделал обратную операцию.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Что-то я в документации к DBI ничего не нашел про это ухищрение(
Плохо смотрел или не туда?) -------------------- Died at Life.pl line 21 |
|||
|
||||
ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
К модулю DBI мое сообщение отношения не имеет.
я предлагаю при создании соединения с БД указывать дополнительный параметр private_dbh_type (это наш собственный параметр для указания типа соединения, в случае, если в программе возможны разные типы соединений). Перед сериализацией выполняем
после десериализации объекта выполняем
где get_dbh_by_type() - функция установки соединения указанного типа -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Чтож, ginnie, вы направили меня на путь истинный) На самом деле все оказалось гораздо проще: перед сохранением объекта в сессию я делаю $obj->set_dbh(undef), а при ее восстановлении $obj->set_dbh($obj->db_connect). Пожалуй это конечно более ресурсоемкий вариант, но у меня нет высокой нагрузки.
ЗЫ: не понимаю, почему мне сразу это в голову не пришло =\ -------------------- Died at Life.pl line 21 |
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
KSURi, показалась странной строка
должно быть либо
либо
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Ну это я абстрактно написал. На самом деле все вот так:
get_root_obj возвращает экземпляр класса в котором прописаны методы для работы с базой. -------------------- Died at Life.pl line 21 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |