camka
не самка
PHP5: Объект теряет структуру при сериализации/десериализации
Имею объект "дерево" достаточно комплексной структуры: свойства объекта являются ссылками на объекты того же класса. Так же имеется такое свойство как "индекс" для быстрого доступа к узлу по его имени (id). В индексе содержатся массив ссылок на все узлы дерева. Все индексы, кроме индекса корневого узла ссылаются на индекс корневого узла. То есть структура примерно такая:
При сохранении объекта между запросами в сессию, структура сохраняется идеально и работа с объектом проходит без каких-либо экстцессов. Однако при сохранении объекта в фаил в сериализованном виде и последующей его десериализации и присвоения некой переменной начинаются аномалии. Некотрые ссылки теряются. Например при обращении к некоторому узлу через свойство "индекс" не происходит надлежащего изменения самого узла.
я начинаю грешить на сериализацию/десереализацию, поскольку проведенные испытаня открыли для меня интересный факт. А именно:
Беру объект из сессии, сериализую, записываю результат в файл, десереализую результат из файла, в результате объект получается ломаный. сериализую его сново - результат сериализации не совпадает с изначальным результатом сериализации (это при беглом сравнении строк).
Так же код вида:
выдает достаточно подозрительные результаты.
Собственно говоря, я и хотел проконсультироваться, нормальное ли это поведение пхп, если один и тот же объект при двойной сериализации/десериализации изменяется. Копал в коментариях мануала. Нашел там подобные проблемы, но ни одно решение не помогло. Посему обращаюсь сюда.
Имею объект "дерево" достаточно комплексной структуры: свойства объекта являются ссылками на объекты того же класса. Так же имеется такое свойство как "индекс" для быстрого доступа к узлу по его имени (id). В индексе содержатся массив ссылок на все узлы дерева. Все индексы, кроме индекса корневого узла ссылаются на индекс корневого узла. То есть структура примерно такая:
PHP:
class node{
public $parent; // type node
public $first_sibling; // type node
public $last_sibling; // type node
public $first_child; // type node
public $index = array();
}
я начинаю грешить на сериализацию/десереализацию, поскольку проведенные испытаня открыли для меня интересный факт. А именно:
Беру объект из сессии, сериализую, записываю результат в файл, десереализую результат из файла, в результате объект получается ломаный. сериализую его сново - результат сериализации не совпадает с изначальным результатом сериализации (это при беглом сравнении строк).
Так же код вида:
PHP:
echo "\n\r",'<br>H: ', serialize ( $_SESSION['node'] ) ;
echo '<br>C: ', serialize ( clone $_SESSION['node'] ) ;
echo '<br>X: ', serialize ( unserialize( serialize ( $_SESSION['node'] ) ) ) ;
echo '<br>X: ', serialize ( unserialize( serialize ( unserialize( serialize ( $_SESSION['node'] ) ) ) ) ) ;
Код:
H: O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:0;s:4:"name";s:4:"root";s:6:"hidden";b:1;s:5:"perms";i:0;}s:6:"parent";N;s:13:"first_sibling";R:1;s:12:"last_sibling";R:1;s:11:"first_child";O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:1;s:4:"name";s:1:"1";s:6:"hidden";b:0;s:5:"perms";i:0;}s:6:"parent";R:1;s:13:"first_sibling";R:8;s:12:"last_sibling";R:8;s:11:"first_child";N;s:5:"index";a:2:{i:0;R:1;i:1;R:8;}s:7:"counter";i:2;}s:5:"index";R:15;s:7:"counter";R:16;}
C: O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:0;s:4:"name";s:4:"root";s:6:"hidden";b:1;s:5:"perms";i:0;}s:6:"parent";N;s:13:"first_sibling";O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:0;s:4:"name";s:4:"root";s:6:"hidden";b:1;s:5:"perms";i:0;}s:6:"parent";N;s:13:"first_sibling";R:8;s:12:"last_sibling";R:8;s:11:"first_child";O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:1;s:4:"name";s:1:"1";s:6:"hidden";b:0;s:5:"perms";i:0;}s:6:"parent";R:8;s:13:"first_sibling";R:15;s:12:"last_sibling";R:15;s:11:"first_child";N;s:5:"index";a:2:{i:0;R:8;i:1;R:15;}s:7:"counter";i:2;}s:5:"index";R:22;s:7:"counter";R:23;}s:12:"last_sibling";R:8;s:11:"first_child";R:15;s:5:"index";R:22;s:7:"counter";R:23;}
X: O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:0;s:4:"name";s:4:"root";s:6:"hidden";b:1;s:5:"perms";i:0;}s:6:"parent";N;s:13:"first_sibling";r:1;s:12:"last_sibling";r:1;s:11:"first_child";O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:1;s:4:"name";s:1:"1";s:6:"hidden";b:0;s:5:"perms";i:0;}s:6:"parent";r:1;s:13:"first_sibling";R:10;s:12:"last_sibling";R:10;s:11:"first_child";N;s:5:"index";a:2:{i:0;r:1;i:1;R:10;}s:7:"counter";i:2;}s:5:"index";R:18;s:7:"counter";R:20;}
X: O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:0;s:4:"name";s:4:"root";s:6:"hidden";b:1;s:5:"perms";i:0;}s:6:"parent";N;s:13:"first_sibling";r:1;s:12:"last_sibling";r:1;s:11:"first_child";O:4:"node":7:{s:5:"props";a:4:{s:2:"id";i:1;s:4:"name";s:1:"1";s:6:"hidden";b:0;s:5:"perms";i:0;}s:6:"parent";r:1;s:13:"first_sibling";R:10;s:12:"last_sibling";R:10;s:11:"first_child";N;s:5:"index";a:2:{i:0;r:1;i:1;R:10;}s:7:"counter";i:2;}s:5:"index";R:18;s:7:"counter";R:20;}